16-lambda匿名函数与python内置函数
lambda匿名函数
python 使用 lambda 来创建匿名函数。
- 所谓匿名,意即不再使用 def 语句这样标准的形式定义一个函数。
- lambda 只是一个表达式,函数体比 def 简单很多。
- lambda 函数拥有自己的命名空间,且不能访问自己参数列表之外或全局命名空间里的参数。
- 虽然lambda函数看起来只能写一行,却不等同于C或C++的内联函数,后者的目的是调用小函数时不占用栈内存从而增加运行效率。
- 匿名函数有个限制,就是只能有一个表达式,不用写return,返回值就是该表达式的结果。
- 用匿名函数有个好处,因为函数没有名字,不必担心函数名冲突。
lambda 函数的语法只包含一个语句:
lambda [arg1 [,arg2,.....argn]]:expression
匿名函数也是一个函数对象,也可以把匿名函数赋值给一个变量,再利用变量来调用该函数:
sum = lambda arg1, arg2: arg1 + arg2
print(sum(3,7))
执行结果:
10
内置函数
查看python的内置变量与内置函数
dir(__builtins__)
执行结果:
['ArithmeticError', 'AssertionError', 'AttributeError', 'BaseException', 'BlockingIOError', 'BrokenPipeError', 'BufferError', 'BytesWarning', 'ChildProcessError', 'ConnectionAbortedError', 'ConnectionError', 'ConnectionRefusedError', 'ConnectionResetError', 'DeprecationWarning', 'EOFError', 'Ellipsis', 'EnvironmentError', 'Exception', 'False', 'FileExistsError', 'FileNotFoundError', 'FloatingPointError', 'FutureWarning', 'GeneratorExit', 'IOError', 'ImportError', 'ImportWarning', 'IndentationError', 'IndexError', 'InterruptedError', 'IsADirectoryError', 'KeyError', 'KeyboardInterrupt', 'LookupError', 'MemoryError', 'ModuleNotFoundError', 'NameError', 'None', 'NotADirectoryError', 'NotImplemented', 'NotImplementedError', 'OSError', 'OverflowError', 'PendingDeprecationWarning', 'PermissionError', 'ProcessLookupError', 'RecursionError', 'ReferenceError', 'ResourceWarning', 'RuntimeError', 'RuntimeWarning', 'StopAsyncIteration', 'StopIteration', 'SyntaxError', 'SyntaxWarning', 'SystemError', 'SystemExit', 'TabError', 'TimeoutError', 'True', 'TypeError', 'UnboundLocalError', 'UnicodeDecodeError', 'UnicodeEncodeError', 'UnicodeError', 'UnicodeTranslateError', 'UnicodeWarning', 'UserWarning', 'ValueError', 'Warning', 'WindowsError', 'ZeroDivisionError', '__build_class__', '__debug__', '__doc__', '__import__', '__loader__', '__name__', '__package__', '__spec__', 'abs', 'all', 'any', 'ascii', 'bin', 'bool', 'bytearray', 'bytes', 'callable', 'chr', 'classmethod', 'compile', 'complex', 'copyright', 'credits', 'delattr', 'dict', 'dir', 'divmod', 'enumerate', 'eval', 'exec', 'exit', 'filter', 'float', 'format', 'frozenset', 'getattr', 'globals', 'hasattr', 'hash', 'help', 'hex', 'id', 'input', 'int', 'isinstance', 'issubclass', 'iter', 'len', 'license', 'list', 'locals', 'map', 'max', 'memoryview', 'min', 'next', 'object', 'oct', 'open', 'ord', 'pow', 'print', 'property', 'quit', 'range', 'repr', 'reversed', 'round', 'set', 'setattr', 'slice', 'sorted', 'staticmethod', 'str', 'sum', 'super', 'tuple', 'type', 'vars', 'zip']
常用内置函数
高级内置函数
enumerate
enumerate() 函数用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,同时列出数据和数据下标,一般用在 for 循环当中。
语法:
enumerate(sequence, [start=0])
- sequence -- 一个序列、迭代器或其他支持迭代对象。
- start -- 下标起始位置
seasons = ['Spring', 'Summer', 'Fall', 'Winter']
# 索引按照默认的从0开始
print(list(enumerate(seasons)))
# 索引按照设置的从1开始
print(list(enumerate(seasons, start=1)))
执行结果:
[(0, 'Spring'), (1, 'Summer'), (2, 'Fall'), (3, 'Winter')]
[(1, 'Spring'), (2, 'Summer'), (3, 'Fall'), (4, 'Winter')]
for 循环使用 enumerate:
seq = ['one', 'two', 'three']
for i, element in enumerate(seq):
print(i, seq[i])
执行结果:
0 one
1 two
2 three
eval
eval() 函数用来执行一个字符串表达式,并返回表达式的值。
语法:
eval(expression[, globals[, locals]])
- expression -- 表达式。
- globals -- 变量作用域,全局命名空间,如果被提供,则必须是一个字典对象。
- locals -- 变量作用域,局部命名空间,如果被提供,可以是任何映射对象。
x = 7
print(eval( '3 * x' ))
print(eval('pow(2,2)'))
print(eval('2 + 2'))
执行结果:
21
4
4
exec
exec 执行储存在字符串或文件中的 python 语句,相比于 eval,exec可以执行更复杂的 Python 代码,exec 返回值永远为 None。
语法:
exec(object[, globals[, locals]])
- object:必选参数,表示需要被指定的Python代码。它必须是字符串或code对象。如果object是一个字符串,该字符串会先被解析为一组Python语句,然后在执行(除非发生语法错误)。如果object是一个code对象,那么它只是被简单的执行。
- globals:可选参数,表示全局命名空间(存放全局变量),如果被提供,则必须是一个字典对象。
- locals:可选参数,表示当前局部命名空间(存放局部变量),如果被提供,可以是任何映射对象。如果该参数被忽略,那么它将会取与globals相同的值。
exec('print("Hello World")')
# 单行语句字符串
exec("print ('baidu.com')")
# 多行语句字符串
exec ("""for i in range(5):
print ("iter time: %d" % i)
""")
print("\n")
x = 10
expr = """
z = 30
sum = x + y + z
print(sum)
"""
def func():
y = 20
exec(expr)
exec(expr, {'x': 1, 'y': 2})
exec(expr, {'x': 1, 'y': 2}, {'y': 3, 'z': 4})
func()
执行结果:
Hello World
baidu.com
iter time: 0
iter time: 1
iter time: 2
iter time: 3
iter time: 4
60
33
34
zip()
语法:
zip([iterable, ...])
zip函数接受任意多个可迭代对象作为参数,将对象中对应的元素打包成一个tuple,然后返回一个可迭代的zip对象。
这个可迭代对象可以使用循环的方式列出其元素。
若多个可迭代对象的长度不一致,则所返回的列表与长度最短的可迭代对象相同。
利用 * 号操作符,可以将元组解压为列表。
a1=[1,2,3]
a2=[4,5,6]
a3=[7,8,9]
a4=["a","b","c","d"]
# 对应的元素打包
zip1=zip(a1,a2,a3)
print(zip1)
for i in zip1:
print(i)
print("\n")
# 长度不一样时候取最短的
zip2=zip(a1,a2,a4)
print(zip2)
for i in zip2:
print(i)
print("\n")
zip3=zip(*a4 *3)
print(zip3)
for j in zip3:
print(j)
执行结果:
<zip object at 0x000001DCE1594208>
(1, 4, 7)
(2, 5, 8)
(3, 6, 9)
<zip object at 0x000001DCE1590E88>
(1, 4, 'a')
(2, 5, 'b')
(3, 6, 'c')
<zip object at 0x000001DCE1590C88>
('a', 'b', 'c', 'd', 'a', 'b', 'c', 'd', 'a', 'b', 'c', 'd')