目录
1作用域的查看
globals()全局
locals()局部
join() 方法用于将序列中的元素以指定的字符连接生成一个新的字符串。
dict.keys()、dict.values() 和 dict.items() 返回的都是视图对象( view objects),提供了字典实体的动态视图,这就意味着字典改变,视图也会跟着变化。
Python3 字典 keys() 方法 | 菜鸟教程 (runoob.com)
from copy import copy
quanju=copy(list(globals().keys()))
print("quanju:",quanju,sep="\n")
print("quanju*:",*quanju,sep="\n")
print()
from copy import copy
quanju=copy(list(globals().keys()))
print("quanju*:",quanju,sep="\n")
print()
a,b=1,2
def f1(c=3):
d=4
print("*global in f1:",*(globals().keys()-quanju)) #f1,a,b
print("local f1:",*(locals().keys())) #c,d
def f2(e=5):
f=None
print("*global in f2:",*(globals().keys()-quanju)) #f1,a,b
print("local f2:", *(locals().keys())) #f2只看见自己的e,f
f2()
if __name__=='__main__':
f1()
2. 覆盖
def f1():
n=1
print(n) #结果2行
def f2():
n=2
print(n) #3行
f2()
print(n) #4行
if __name__=='__main__':
n=3
print(n) #1行
f1()
print(n) #5行
结果:
3
1
2
1
3
global 和 nonlocal关键字
def f1():
n=1
print(n) #结果2行
def f2():
nonlocal n
n=2
print(n) #3行
f2()
print(n) #4行
if __name__=='__main__':
n=3
print(n) #1行
f1()
print(n) #5行
3.作用域的生命周期
built-in :与解释器同生共死
golbal:导入模块创建
local:函数调用
4.函数式编程
4.1一等函数
一等对象定义:
在运行时创建
能赋值给变量
能作为参数传给函数
能作为函数的返回结果
def a():
print("hello")
a() #在运行时创建
print("在运行时创建")
b=a #能赋值给变量
b()
def c(f,n): #能作为参数传给函数
for i in range(n):
a()
print(" 能作为参数传给函数")
c(a,2)
print("作为函数的返回值")
def c1(f,n):
def c2():
for i in range(n):
a()
return c2
d=c1(a,3)
d()
hello
在运行时创建
hello
能作为参数传给函数
hello
hello
作为函数的返回值
hello
hello
hello
4.2高阶函数
map
map()函数会根据提供的函数对指定序列做映射。
map(行为,对象集)每个对象执行一次行为
>>> def square(x) : # 计算平方数
... return x ** 2
...
>>> map(square, [1,2,3,4,5]) # 计算列表各个元素的平方
<map object at 0x100d3d550> # 返回迭代器
>>> list(map(square, [1,2,3,4,5])) # 使用 list() 转换为列表
[1, 4, 9, 16, 25]
>>> list(map(lambda x: x ** 2, [1, 2, 3, 4, 5])) # 使用 lambda 匿名函数
[1, 4, 9, 16, 25]
>>>
filter
filter() 函数用于过滤序列,过滤掉不符合条件的元素,返回一个迭代器对象,如果要转换为列表,可以使用 list() 来转换。
reduce
from functools import reduce
def s(a,b):
return a*b
print(reduce(s,range(1,5)))
1*2=2
2*3=6
6*4=24
sorted
注:sort应用在list
sorted返回是一个新的list,而不是在原基础上进行操作
>>> sorted([x*(-1)**x for x in range(10)])
[-9, -7, -5, -3, -1, 0, 2, 4, 6, 8]
>>> sorted([x*(-1)**x for x in range(10)],key=abs)#abs绝对值排序
[0, -1, 2, -3, 4, -5, 6, -7, 8, -9]
>>> sorted([x*(-1)**x for x in range(10)],reverse=True) #reverse=True降序
[8, 6, 4, 2, 0, -1, -3, -5, -7, -9]
偏函数partial
解决参数很多,但变化只变其中一两个 输入重复麻烦问题
from functools import partial def mod( n, m ): return n % m mod_by_100 = partial( mod, 100 ) print mod( 100, 7 ) # 2 print mod_by_100( 7 ) # 2
>>> from functools import partial
>>> a=partial(sorted,key=abs)
>>> a([x*(-1)**x for x in range(10)])
[0, -1, 2, -3, 4, -5, 6, -7, 8, -9]
>>> aa=partial(sorted,reverse=True)
>>> aa([x*(-1)**x for x in range(10)])
[8, 6, 4, 2, 0, -1, -3, -5, -7, -9]
4.3匿名函数
lambda 来创建匿名函数。
特点:只能使用纯表达式,不能赋值,不能使用while和try等块语句
lambda [arg1 [,arg2,.....argn]]:expression
>>> a=lambda x,y:x+y
>>> a(3,4)
7
list+lambda可以得到行为列表
>>> a=[lambda x:x+1,lambda x:x**2,lambda x:x**3]
>>> [a[i](10) for i in range(3)] #把10传进去
[11, 100, 1000]
>>> [a[i](2) for i in range(3)]
[3, 4, 8]
>>> b=[lambda x:x**i for i in range(5)]
>>> [b[j](10) for j in range(5)]
[10000, 10000, 10000, 10000, 10000]