python函数基础(2)-----内置函数、作用域、闭包、递归
2018-01-20 12:06
761 查看
python函数基础(2)
1.常见的内置函数常见的内置函数: 查看内置函数: print(dir(__builtins__)) 常见函数 len 求长度 min 求最小值 max 求最大值 sorted 排序 reversed 反向 sum 求和 进制转换函数: bin() 转换为二进制 oct() 转换为八进制 hex() 转换为十六进制 ord() 将字符转换成对应的ASCII码值 chr() 将ASCII码值转换成对应的字符 补充: 1.enumerate() #返回一个可以枚举的对象 2.filter() #过滤器 3.map() #加工。对于参数iterable中的每个元素都应用fuction函数,并返回一个map对象 4.zip() #将对象逐一配对
2.函数内变量的作用域
变量的作用域与其定义的方式有关: 局部变量: 变量在函数内部定义,则变量的作用域在函数内部 全局变量:变量在函数外部定义的,则变量的作用域是全局 global:用来在函数或其他局部作用域中,声明全局变量。 (作用于全局) nonlocal:用来在函数或其他作用域中,声明外层(非全局)变量。(作用于局部) 使用global情况: 全局变量可以在函数内部访问,但是不能改变 如果在函数内部想修改全局变量,可以用 global 来修饰变量 局部变量只能在局部进行访问和修改。 如果在函数外部,想访问局部变量,也可以用 global,将局部变量声明为全局变量 使用nonlocal的情况: 当里层局部,需要修改外层局部时,需要使用nonlocal。 (如嵌套函数) 总结: global :函数中,需要修改全局变量时,用global nonlocal:当里层局部,需要修改外层局部时,需要使用nonlocal。 (局部调用局部,使用nonlocal)
3.内嵌函数和闭包
内嵌函数: 在函数内部定义函数,就是函数里面嵌套函数 闭包:一个闭包就是你调用了一个函数A,这个函数A返回了一个函数B给你。这个返回的函数B就叫做闭包。(但是B函数,一定要是嵌套在函数A里面) 。你在调用函数A的时候传递的参数就是自由变量。 总结:一个函数里面嵌套一个函数,调用外面这个函数,就返回里面嵌套的函数。
4.递归函数
递归: 函数调用自己本身 ''' 例题:有5个人坐在一起,问第五个人多少岁?他说比第4个人大2岁。 问第4个人岁数,他说比第3个人大2岁。 问第三个人,又说比第2人大两岁。 问第2个人,说比第一个人大两岁。 最后问第一个人,他说是10岁。 请问第五个人多少岁? ''' 递归的核心: 1.递归推导式 2.递归终止条件
日常练习
li = [1,2,3,4,5,6] #查看内置函数: print(dir(__builtins__)) ##内置函数 print(len([1,2,3])) #求长度 print(min([1,2,3])) #求最小值 print(max([1,2,3])) #求最大值 print(sorted(li,key = int,reverse = True)) #排序 #reversed() 反转,逆序对象 print(sum([1,2,3],2))#从2开始加,即初始值为2 #进制转换函数: print(bin(5))#转换为二进制 print(oct(16))#转换为八进制 print(hex(15)) #转化为16进制 print(ord('a'))#97 将字符转换成对应的ASCII码值 print(ord('A'))#65 print(chr(65))#'A'将ASCII码值转换成对应的字符 #补充 print(enumerate([1,2,3])) print(list(enumerate([1,2,3])))#返回一个枚举对象(索引,值)索引可以自定义 print(dict(enumerate(['a','b','c'],2)))#{2: 'a', 3: 'b', 4: 'c'} print(filter(None,[1,2,3]))#<filter object at 0x000001E052827FD0> #过滤器 print(list(filter(lambda x:x>1,[1,2,3]))) ''' 给定一个过滤的函数当参数,过滤可迭代对象 ''' #加工。对于参数iterable中的每个元素都应用fuction函数,并返回一个map对象 print(list(map(lambda x:x+1,[1,2,3,4])))#[2, 3, 4, 5] print(list(map(str,[1,2,3,4])))#['1', '2', '3', '4'] #配对 print(list(zip([1,2,3]))) #[(1,), (2,), (3,)] print(list(zip([1,2,3],['a','b','c'])))#[(1, 'a'), (2, 'b'), (3, 'c')] print(list(zip([1,2,3],['a','b','c'],(11,22,33)))) ##函数内变量的作用域 x=1 #全局变量 def fun(): global y y=2 #局部变量 global x x+=1 print(x,y) fun() def fun1(): a=1 a+=1 print(a) fun1() ##lianxi a=10 def f1(): global a a+=1 print(a) f1() def f2(): global a a=1 print(a) f2() ##nonlocal 当局部里层想修改局部外层时 def fun2(): q=1 #局部外层 print('局部外层',q) def fun3(): w=22 nonlocal q q+=1 print(q) print('局部里层',w) fun3() fun2() ##闭包 嵌套函数 def fun4(a): print(a) def fun5(b): print(a,b) return fun5 #调用不执行 fun4(5) fun4(5)(6) ##回调函数 def fun6(): print('第一个函数') def fun7(a): #把上一个函数体当成参数 a() print('第二个函数') fun7(fun6) ##递归 调用自己 def age(n): if n==1: return 18 else: return age(n-1)+2 print('第五个人%d岁'%age(5)) #阶乘 # 5!=5*4*3*2*1 def jiec(n): if n==1: return 1 else: return jiec(n-1)*n print('5!:',jiec(5))
结果输出:
============== ['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'] 3 1 3 [6, 5, 4, 3, 2, 1] 8 0b101 0o20 0xf 97 65 A <enumerate object at 0x0000001B6AF236C0> [(0, 1), (1, 2), (2, 3)] {2: 'a', 3: 'b', 4: 'c'} <filter object at 0x0000001B6AA61AC8> [2, 3] [2, 3, 4, 5] ['1', '2', '3', '4'] [(1,), (2,), (3,)] [(1, 'a'), (2, 'b'), (3, 'c')] [(1, 'a', 11), (2, 'b', 22), (3, 'c', 33)] 2 2 2 11 1 局部外层 1 2 局部里层 22 5 5 5 6 第一个函数 第二个函数 第五个人26岁 5!: 120
问题解答:
#1.定义一个函数,输入一个序列(序列元素是同种类型),判断序列是顺序还是逆序,顺序输出UP,逆序输出DOWN,否则输出None #解答: print('#1.解答:') li = [9,8,3,2,6,4,5,7,1] li1 = [1,2,3,4,5,6] li2 = [6,5,4,3,2,1] li3 = 'z',5,4,'d',2,1 def judge(li): try: li = list(li) if(sorted(li)==li): print('顺序序列----->UP') elif(sorted(li,reverse=True)==li): print('逆序序列----->DOWN') else: print('None') except Exception as e: print('你输入为非序列,请输入一个序列') judge(li) judge(li1) judge(li2) judge(li3) #2.写一个函数,对列表li = [9,8,3,2,6,4,5,7,1],进行从小到大的排序。最后返回li #解答: #冒泡排序: def bubbleSort(li): lenght = len(li) for i in range(0,lenght-1): for j in range(0,lenght-i-1): if li[j]>li[j+1]: li[j],li[j+1] = li[j+1],li[j] return li #选择排序 def selectSort(li): lenght = len(li) for i in range(0,lenght-1): for j in range(i+1,lenght-1): if li[i]>li[j]: li[i],li[j] = li[j],li[i] return li #插入排序 def insertSort(li): lenght = len(li) if lenght <2: return li for i in range(1,lenght): tmp = li[i] j = i-1 while j>=0 and tmp < li[j]: li[j+1] = li[j] j =j - 1 li[j+1] = tmp return li #快速排序 def quickSort(li): lenght = len(li) if lenght <2: return li min1 = [] max1 = [] mid = li.pop(0) for i in li: if i < mid: min1.append(i) else: max1.append(i) return quickSort(min1) + [mid] + quickSort(max1) #.......... #函数调用: print('#2.解答:') print(bubbleSort(li)) print(selectSort(li)) print(insertSort(li)) print(quickSort(li))
结果输出:
===== #1.解答: None 顺序序列----->UP 逆序序列----->DOWN 你输入为非序列,请输入一个序列 #2.解答: [1, 2, 3, 4, 5, 6, 7, 8, 9] [1, 2, 3, 4, 5, 6, 7, 8, 9] [1, 2, 3, 4, 5, 6, 7, 8, 9] [1, 2, 3, 4, 5, 6, 7, 8, 9] >>>
相关文章推荐
- python基础-内置函数-作用域-闭包-递归-python3
- python基础-08-内置函数、作用域、闭包、递归
- 第七篇 python基础之函数,递归,内置函数
- 第七篇 python基础之函数,递归,内置函数
- Python基础3 函数、递归、内置函数
- python基础之函数,递归,内置函数
- Day3 - Python基础3 函数、递归、内置函数
- Python基础教程--抽象,函数,参数,递归,作用域
- Python基础(协程函数、内置函数、递归、模块和包)-day05
- python全栈开发-Day9 函数对象、函数嵌套、名称空间与作用域(装饰器基础)
- Python3基础 用 函数递归求解 一个数字的阶乘
- 函数:内嵌函数和闭包 - 零基础入门学习Python020
- python基础学习之函数(2)-内嵌函数和闭包
- Python开发基础-Day6-函数参数、嵌套、返回值、对象、命名空间和作用域
- Python3基础 用 函数递归实现 斐波那契数列
- 王亟亟的Python学习之路(10)-函数对象的作用域,函数作为返回值,闭包
- python基础之函数参数、嵌套、返回值、对象、命名空间和作用域
- python基础----函数的定义和调用、return语句、变量作用域、传参、函数嵌套、函数对象、闭包、递归函数
- Python入门基础语法之序列、字典、函数、递归
- 零基础入门学习Python(22)--函数:递归是神马