内置函数&匿名函数
1、内置函数
作用域相关
基于字典的形式获取局部变量和全局变量
globals()——获取全局变量的字典
locals()——获取执行本方法所在命名空间内的局部变量的字典
输入输出相关:
input() 输入
print() 输出
数据类型相关:
type(o) 返回变量o的数据类型
内存相关:
id(o) o是参数,返回一个变量的内存地址
hash(o) o是参数,返回一个可hash变量的哈希值,不可hash的变量被hash之后会报错。
hash函数会根据一个内部的算法对当前可hash变量进行处理,返回一个int数字。
*每一次执行程序,内容相同的变量hash值在这一次执行过程中不会发生改变。
文件操作相关
open() 打开一个文件,返回一个文件操作符(文件句柄)
操作文件的模式有r,w,a,r+,w+,a+ 共6种,每一种方式都可以用二进制的形式操作(rb,wb,ab,rb+,wb+,ab+)
可以用encoding指定编码.
模块操作相关
__import__导入一个模块
帮助方法
在控制台执行help()进入帮助模式。可以随意输入变量或者变量的类型。输入q退出
或者直接执行help(o),o是参数,查看和变量o有关的操作
和调用相关
callable(o),o是参数,看这个变量是不是可调用。
如果o是一个函数名,就会返回True
查看参数所属类型的所有内置方法
dir() 默认查看全局空间内的属性,也接受一个参数,查看这个参数内的方法或变量
和数字相关
数字——数据类型相关:bool,int,float,complex
数字——进制转换相关:bin,oct,hex
数字——数学运算:abs,divmod,min,max,sum,round,pow
和数据结构相关
序列——列表和元组相关的:list和tuple
序列——字符串相关的:str,format,bytes,bytearry,memoryview,ord,chr,ascii,repr
序列:reversed,slice
数据集合——字典和集合:dict,set,frozenset
数据集合:len,sorted,enumerate,all,any,zip,filter,map
内置函数小结:
其他:input,print,type,hash,open,import,dir
str类型代码执行:eval,exec
数字:bool,int,float,abs,divmod,min,max,sum,round,pow
序列——列表和元组相关的:list和tuple
序列——字符串相关的:str,bytes,repr
序列:reversed,slice
数据集合——字典和集合:dict,set,frozenset
数据集合:len,sorted,enumerate,zip,filter,map
2、匿名函数
2.1 匿名函数的基本描述:
匿名函数的格式:
函数名 = lambda 参数:返回值
参数:可以有多个,用逗号隔开
匿名函数不管逻辑多复杂,只能写一行,且逻辑执行结束后的内容就是返回值
返回值和正常的函数一样可以是任意数据类型
我们可以看出匿名函数并不是正的不能有名字,匿名函数跟正常的函数调用是一样的:函数名(参数)
例如有如下的代码
def calc(n):
return n**n
print(calc(10))
我们可以用匿名函数来替换:
calc = lambda n:n**n
print(calc(8))
匿名函数:calc:函数名
lambda: 定义匿名函数关键字和def相似
n:参数
n**n:返回值
例1:请把下面的函数转换为匿名函数
def add(x,y):
return x+y
add = lambda x,y: x+y
print(add(2,3))
匿名函数是真的可以匿名:
1 L = [3,2,100,999,213,1111,31121,333] 2 print(max(L)) 3 dic = {'k1':10,'k2':100,'k3':30} 4 print(max(dic))#这里实际比较的是key的ASCII值大小 5 print(dic[max(dic,key = lambda k:dic[k])])
1 31121 2 k3 3 100
这里的key就是字典的value值,k是字典的key,这里省去了匿名函数名
例2:把下面的代码转换为函数
1 res = filter(lambda x:x > 10,[5,8,11,9,15]) 2 for i in res: 3 print(i) 4 def func(x): 5 return x > 10 6 res = filter(func,[5,8,11,9,15])#筛选大于10的数 7 for i in res: 8 print(i)
1 11 2 15 3 11 4 15
小结:
可以和lambda合作完成匿名函数的有:min、max、filter、map、sorted、zip
zip() 函数用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的列表。
如果各个迭代器的元素个数不一致,则返回列表长度与最短的对象相同
实际上zip(a,b)的作用就是把a和b里面的参数挨个组成元组,组成多少对是以少元素的那个为准
map() 会根据提供的函数对指定序列做映射。
第一个参数 function 以参数序列中的每一个元素调用 function 函数,返回包含每次 function 函数返回值的新列表
实际上map(function,a)就是a就是以function为原则进行计算,map()更多的是跟匿名函数lambda组合使用。
filter() 函数用于过滤序列,过滤掉不符合条件的元素,返回由符合条件元素组成的新列表。
该接收两个参数,第一个为函数,第二个为序列,序列的每个元素作为参数传递给函数进行判,然后返回 True 或 False,
最后将返回 True 的元素放到新列表中
实际上是把一个其它函数func,然后用filter(func,x)来调用func,调用过程每次是由x来产生
sorted 语法:sorted(iterable[, cmp[, key[, reverse]]])
>>> students = [('john', 'A', 15), ('jane', 'B', 12), ('dave', 'B', 10)]
>>> sorted(students, key=lambda s: s[2]) # 按年龄排序
[('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]
iterable -- 可迭代对象。
cmp -- 比较的函数,这个具有两个参数,参数的值都是从可迭代对象中取出,此函数必须遵守的规则为,大于则返回1,小于则返回-1,等于则返回0。
key -- 主要是用来进行比较的元素,只有一个参数,具体的函数的参数就是取自于可迭代对象中,指定可迭代对象中的一个元素来进行排序。
reverse -- 排序规则,reverse = True 降序 , reverse = False 升序(默认)。
2.2 面试题1:下面程序的输出结果为:
1 d = lambda p:p*2 2 t = lambda p:p*3 3 x = 2 4 x = d(x) #4 5 x = t(x) #12 6 x = d(x) #24 7 print(x)
1 24
2.3 面试题2:现在有两元组:
(('a'),('b')),(('c'),('d')),请使用python中匿名函数生成列表[{'a':'c'},{'b':'d'}]
1 L1 = (('a'),('b')) 2 L2 = (('c'),('d')) 3 dic = {} 4 func = lambda a,b:x[a][b] 5 func2 = lambda y:y[1] 6 def func3(T2,x): 7 return T2[x] 8 # dic = {func(L[0][0]):func(L[1][0]),func2(L[0][1]):func2(L[1][1])} 9 dic = {func3(L1[0]):func3(L2[0]),func3(L1[1]):func3(L2[1])} 10 print(dic)
注意:考匿名函数,那么一般也要考相应的内置函数
1 ret = zip((('a'),('b')),(('c'),('d'))) #组对 2 3 def func(tup): 4 return {tup[0],tup[1]} 5 res = map(func,ret) 6 print(list(res)) 7 8 ret = zip((('a'),('b')),(('c'),('d'))) 9 print(ret) 10 for i in ret: 11 print(i) 12 dic = map(lambda tup:{tup[0]:tup[1]},ret) 13 print(list(dic))
1 讲解1结果: 2 [{'a', 'c'}, {'b', 'd'}] 3 <zip object at 0x000000000299C248> 4 ('a', 'c') 5 ('b', 'd') 6 []
zip()计算以后[('a','c'),('b','d')]
1 ret = zip((('a'),('b')),(('c'),('d'))) #组对 2 res = map(lambda tup:{tup[0]:[1]},ret) 3 print(list(res))
1 讲解2打印结果: 2 [{'a': [1]}, {'b': [1]}]
2.4 面试题3:以下代码的输出是什么?请给出答案并解释
1 def multipliers(): 2 return [lambda x:i*x for i in range(4)] 3 print([m(2) for m in multipliers()])
1 [6, 6, 6, 6] 2 3 请修改multipliers的定义来产生期望的结果