python函数

一、python的作用域

#############python中的作用域分4种情况。
L:local 局部作用域,即函数中定义的变量
E:enclosing 镶嵌的父级函数的局部作用域,即包含此函数的上级函数的局部作用域,但不是全局的。
G:globa 全局变量,就是模块级别定义的变量。
B:built-in 系统固定模块里面的变量,比如int,pytearray等。
搜索变量的优先级顺序依次是:作用局域部 > 外层作用域 > 当前模块中的全局python内置作用域,也就是LEGB。

*****## (局部改全局变量)通过在def中声明global 变量 就可以修改全局变量
count = 10
def a():
global count
print(count)
count='123'
print(count)
a()
print(count)

########(通过nonlocal声明函数中的第二层就可以在local中修改)


###函数名可以进行赋值
###函数名可以作为函数的参数,还可以作为函数的返回值

******递归函数****

def a(n):
if n ==1: #设置结束值
return 1 ##结束 返回1
return n*a(n-1) #实现n*(n-1)一直持续
##递归函数
1.调用自身函数
2.有一个结束条件
3.递归能解决的问题循环都能实现(递归效率底)(有限的)

####filter #过滤 (迭代器)

##语法
filter(function, iterable)
*function -- 判断函数。
*iterable -- 可迭代对象。


def is_odd(n):
return n % 2 == 1
ret=filter(is_odd,[1,2,3,4,5,6,7,8,9,10])
print(list(ret))
#结果 [1, 3, 5, 7, 9]

#map #(迭代器)

会根据提供的函数对指定序列做映射 ret = map(a,['name','age','sex'])

def a(n):
return n + 'zhangbin'

ret = map(a,['name','age','sex'])
print(list(ret))

#结果 ['namezhangbin', 'agezhangbin', 'sexzhangbin']

reduce ##在functools 模块中 对参数序列中元素进行累积

import functools
def add(x,y):
return x+y
ret = functools.reduce(add,range(101))
print(ret)
#结果 5050(1+2+3..+100)

#####lambda ##匿名函数

ret = lambda x,y:x+y
print(ret(2,3))

闭包函数

闭包=函数+定义函数的变量

def a():
x=10 #定义函数的变量
def b():
print(x) ##这个值(执行的是a函数的变量)
return b
a()() ##结果为10(b函数)
x=a()
x() ##结果为10 (b函数)

装饰器函数(为之前的函数添加新的功能)

foo=show_time(foo) 等于 @show_time

import time

def foo():
print('foo')
time.sleep(2)

def show_time(t):
def inner():
start=time.time()
t()
end=time.time()
print(end-start)
return inner

@show_time ############
def foo():
import time
print('foo')
time.sleep(2)

foo()
# foo=show_time(foo) ###############
# foo()

列表生成式(能放函数)

a=[x*x for x in range(10)] #先取生成的元素 在执行前面的操作 然后放入列表
print(a)

结果 [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

生成器(查看 next)是一个可迭代对象

生成器的2种方法
1.s=(x*x for x in range(10))
2.yield
#查看
1.next ## 查看函数生成器中的类容(一次看一个数据)next(a)
2.send 类似next方法(传参数)(不同的是它可以在函数中给yield前面的变量赋值)


def w():
print('ok1')
c=yield 1 ##这里变量赋值
print(c)
yield 2
a=w()
print(a)
a.send(None)
a.send('aaa')
##结果
ok1
aaa

#方法一
s=(x*x for x in range(10))
print(s)
print(next(s))

结果
<generator object <genexpr> at 0x00000000024BF360>
0
#方法二
def num(x):
n,a,b = 0,0,1
while n < x:
yield b #########生成器
a,b=b,a+b
n+=1
q=num(5)
print(q)
print(next(q))
print(next(q))
print(next(q))

结果
1
1
2

迭代器(生成器就是迭代器)(生成器就是一种特殊的迭代器)

迭代器满足2个条件
1.有iter方法
2.有next方法

l=[1,2,3,4]
d=iter(l) ##<list_iterator object at 0x0000000002519898>(迭代器)
print(d) ##结果 <list_iterator object at 0x0000000002519898>

print(next(d)) ##结果 1
print(next(d)) ##结果 2

原文地址:https://www.cnblogs.com/zhangb8042/p/8434343.html