Python中的函数

Posted by JustDoDT on January 7, 2018

1. Python中简单内置函数

1.1 内置对象查看

#dir(__builtin__)
In [2]: print(dir(__builtin__))
['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', 'ZeroDivisionError', '__IPYTHON__', '__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', 'display', 'divmod', 'enumerate', 'eval', 'exec', 'filter', 'float', 'format', 'frozenset', 'get_ipython', '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', 'range', 'repr', 'reversed', 'round', 'set', 'setattr', 'slice', 'sorted', 'staticmethod', 'str', 'sum', 'super', 'tuple', 'type', 'vars', 'zip']

1.2 常见函数

len 求长度

min 求最小值

max 求最大值

sorted 排序

reversed 倒序

sum 求和

In [4]: a = [2,8,5]
In [5]: len(a)    #求长度
Out[5]: 3

In [6]: min(a)   #求最小值
Out[6]: 2

In [7]: max(a)   #求最大值
Out[7]: 8

In [8]: sorted(a)  #排序
Out[8]: [2, 5, 8]

In [9]: reversed(a)  #倒序,返回的是内存地址
Out[9]: <list_reverseiterator at 0x7f33e2d779e8>

In [10]: a
Out[10]: [2, 8, 5]

In [11]: list(reversed(a))  #把返回的倒序的内存地址直接转换为列表
Out[11]: [5, 8, 2]

In [12]: sum(a)   #求和
Out[12]: 15

1.3 进制转换函数

bin 转换为二进制

oct 转换为八进制

hex 转换为十六进制

ord 字符转ASCII码

chr ASCII码转字符

In [14]: bin(12)  #把10进制的12转换为二进制
Out[14]: '0b1100'

In [15]: oct(9)   #把十进制的9转换为8进制
Out[15]: '0o11'

In [16]: hex(12)  #把十进制的12转换为十六进制
Out[16]: '0xc'

In [17]: ord('A')  #把A转换为ASCII码
Out[17]: 65

In [18]: ord('a')  #把a转换为ASCII码
Out[18]: 97

In [19]: chr(97)   #把97的ASCII码转为字符
Out[19]: 'a'
In [21]: chr(65)   #把65的ASCII码转为字符
Out[21]: 'A'

2. Python中高级内置函数

1. enumerate

enumerate,返回一个可以枚举的对象,如列表,字典,元组

In [22]: a = ['a','b','c','d']
In [23]: enumerate(a)
Out[23]: <enumerate at 0x7f33e6571318>

In [24]: list(enumerate(a))   #转换为列表
Out[24]: [(0, 'a'), (1, 'b'), (2, 'c'), (3, 'd')]

In [25]: tuple(enumerate(a))  #转换为元组
Out[25]: ((0, 'a'), (1, 'b'), (2, 'c'), (3, 'd'))

In [26]: dict(enumerate(a))   #转换为字典
Out[26]: {0: 'a', 1: 'b', 2: 'c', 3: 'd'}
    
In [28]: set(enumerate(a))   #转换为集合
Out[28]: {(0, 'a'), (1, 'b'), (2, 'c'), (3, 'd')}    

2. eval

eval

(1)取出字符串中的内容

(2)将字符串str当成有效的表达式来求值并返回计算结果

In [29]: a = '1+2+3'
In [30]: a
Out[30]: '1+2+3'

In [31]: eval(a)
Out[31]: 6

3. exec

exec,执行字符串或complie方法编译过的字符串;不常用

In [35]: exec('b = 4')
In [36]: b
Out[36]: 4

4. filter 过滤器

In [37]: def func(x):
    ...:     return x > 5
    ...: 
    ...: 

In [38]: a = [1,3,6,7,8]

In [39]: filter(func,a)
Out[39]: <filter at 0x7f33e2d6a3c8>

In [40]: list(filter(func,a))
Out[40]: [6, 7, 8]

5. map

map,对于参数iterable中的每个元素都应用function函数,并将结果作为列表返回

In [41]: def func(num):
    ...:     return num + 2
    ...: 
    ...: 

In [42]: a = [1,3,5,7]
In [43]: map(func,a)
Out[43]: <map at 0x7f33e2503cf8>
In [47]: list(map(func,a))   #把列表对应函数转换
Out[47]: [3, 5, 7, 9]
    
In [48]: list(map(str,a))	#把列表转换为字符串
Out[48]: ['1', '3', '5', '7']    

6. zip

zip,将对象逐一配对

In [52]: a = [1,2,3]
In [53]: b = ('a','b',1)
In [58]: c = ['a','b','c','d','e']
    
In [54]: list(zip(a,b))   #把对象a和对象b配对
Out[54]: [(1, 'a'), (2, 'b'), (3, 1)]
    
In [59]: list(zip(a,c))   #只配对有共同的有的元素的个数
Out[59]: [(1, 'a'), (2, 'b'), (3, 'c')]

In [55]: tuple(zip(a,b))
Out[55]: ((1, 'a'), (2, 'b'), (3, 1))

In [56]: dict(zip(a,b))
Out[56]: {1: 'a', 2: 'b', 3: 1}

In [57]: set(zip(a,b))
Out[57]: {(1, 'a'), (2, 'b'), (3, 1)}

7. 作业

定义一个函数,可以对输入的数据进行排序,通过参数来决定是正向还是反向排序

def func(*args,reverse):     #*args是可以传输多个对象的;如果只用参数a,就只能用一个
    if reverse == 1:
        b = sorted(args)
        print(b)
    elif reverse == 2:
        c = sorted(args,reverse=True)
        print(c)
    else:
        print('您的输入有误,请重新输入:')
func(*[12,3,94,0,5,2,2],reverse=1)  #如果去掉*,就不能排序了,因为一个列表不能有多个参数

8. 匿名函数

lambda表达式,可以传递参数

def test(a,b,func):
    c = func(a,b)
    return c
num = test(2,3,lambda x,y:x*y)
print(num)

8.1 函数的作用域

lambda 表达式传参,可以传递函数

def test(a,b,func):
    c = func(a,b)
    return c
num = test(2,3,lambda x,y:x*y)
print(num)

6

函数的作用域,函数先执行局部变量,再执行全局变量

a = 100   #全局变量
def func():
    #修改全局变量
    global a  #声明全局变量,但是我要修改你了,你做好准备了吗?
    a = 200
    a += 1
    print(a)
func()
print(a)

201
201

nonlocal 用于函数的嵌套

def func():
    a = 200
    def func_2():
        nonlocal a # 函数嵌套,想要改变这个局部变量
        a += 1
        return a
    return func_2()   #缩进最能体现函数的作用域
a = func()
print(a)

201

闭包:函数里面再定义一个函数,并且外层函数返回了内层函数的函数体 函数里面再定义一个函数,这个函数用到了外面这个函数变量

def test(num):
    def test_in(num_in):
        print(num_in)
        return num + num_in
    return test_in
a = test(100)
print(a(120))

120
220

递归,在python中使用得很少,递归太消耗效率了

def func(num):
    if num > 1:
        return num * func(num - 1)
    else:
        return num
# print(func(10000)) #超过了递归的深度
print(func(5))

120