变量名的查找规则;
在访问变量时,先查找本地变量,然后是包裹此函数的外部函数的内部变量,之后是全局变量,最后是内置变量
1 在函数内使用全局变量
v = 100
def function():
global v #声明全局变量v
v = 200 #改变全局变量v
print(v)
function()
print(v)
执行结果
200
200
2使用nonlocal声明的变量不是局部变量,也不是全局变量,而是外部嵌套函数内的变量
v = 100
def function():
v = 200
def inner():
nonlocal v #指定v为外层嵌套的作用域
print(v)
inner()
function()
print(v)
执行结果
200
100
函数名是变量,它在创建函数时绑定一个函数对象
def fn():
print(1)
f1 = fn
f1()
print(type(f1))
执行结果
1
<class 'function'>
函数有很多参数时,如果固定一些参数,可以利用functools模块Partial得到一个偏函数,方便以后的使用。
print(int('123'))
print(int('11001',base=2)) #2进制转换成整形
执行结果
123
25
可以设置偏函数
import functools
int2 = functools.partial(int,base=2)
print(int2('10110'))
执行结果
22
python中内置的高阶函数map,reduce,filter,sorted可以用来结构的封装
map(func,*iterable)把迭代器内的n个元素都进行func运算
def power2(x):
return x**2
mit = map(power2,range(1,5))
print(type(mit))
for i in mit:
print(i)
执行结果
<class 'map'>
1
4
9
16
reduce()函数会对参数序列中的元素进行函数运算后累积
from functools import reduce
def fun1(x,y):
return x*y
a = reduce(fun1, range(1,5))
print(a)
执行结果
24(1*2*3*4)
筛选可迭代对象中的数据,返回一个课迭代对象
import functools
def fun1(x):
return x%2 == 1
a = filter(fun1, range(1,5))
for i in a:
print(i)
执行结果
1
3
newlist = sorted(listname,key=None,reverse=False)
listname为目标列表,key表示指定一个从每个列表元素中提取一个比较的键,reverse为可选参数,当指定为True时为降序,如果为Flase则为升序。默认为升序。
my_list = [2,1,3,5,4,6,8,9,7,10]
my_list.sort()#这种格式是直接在列表后使用sort()函数
b = sorted(my_list)#这种方式是定义一个新列表来存放排序过的序列
print(b)
print(my_list)
执行结果
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
lambda [参数1,参数2.。] : 表达式
作用:创建一个无名函数对象,通def类似,但不提供函数名
用途:在有些场合下不需要取名字,只要在这个地方用一下
def myadd(x,y):
return x+y
可以改写成:
myadd = lambda x,y : x+y
print("20+30=",myadd(20,30))
执行结果
20+30= 50
说明:如果一个内嵌函数访问函数外部作用域的变量,则这个函数就是闭包
例:
def make_power(x):
def fn(arg):
return arg ** x
return fn
f2 = make_power(2)
print(f2(10))
f3 = make_power(3)
print(f3(10))
执行结果
100
1000
目的:在不改变函数名的情况下,改变了包装函数(对象)的行为
def 装饰器函数名 (参数):
函数块
return 函数
例:
def msg_service(fn):
def servemoney2(name,x):
print("欢迎存钱")
fn(name,x)
print("存钱结束")
return servemoney2
@msg_service
def servemoney(name,x):
print(name,'存了',x,'元')
servemoney("小张",100)
#@msg_service的作用相当于servemoney = msg_service(servemoney)
执行结果
欢迎存钱
小张 存了 100 元
存钱结束