Python全栈之路Day19

## 一. 上节课复习 1. 为何要使用函数 1. 解决代码重用问题 2. 统一维护 3. 程序的组织结构清晰,可读性强 1. 定义函数 1. !!!先定义后使用 ```python def funcname(arg1,arg2,....) #funcname = 函数体 '''描述信息''' 函数体 return value ``` 2. 定义无参函数 定义有参函数 定义空函数 2. 调用函数 1. 语句形式:foo() 2. 表达式形式:foo(1,2) 3. 函数调用作为另外一个函数的参数:print(foo(1,2)) 3. 函数返回值 1. 不写return--->None 2. return 一个值--->这个值 3. return 多个值--->由这多个值组成的元组 4. 函数的参数 1. 形参 2. 实参数 3. 从实参的角度: * 按位置传值 foo(1,2) * 按关键字传值 foo(y=1,x=2) * 混合传值 foo(1,y=2) 4. 从形参角度: * 位置参数 def foo(x,y,z) * 默认参数 def foo(x,y=1) * 什么时候用: * 在调用函数时,每次调用传入的值都在变化,使用位置参数,变化较小使用默认参数 * 二者的位置排列: * 位置参数必须在默认参数的左边 * 二者的特性: * 位置参数 必须传值,默认参数可传可不传 5. \*args: ```python def foo (x,\*args) foo(1,2,3,4,5) ``` \** kwargs: ```python def foo (x,**kwargs) foo(1,y=2,z=3) ``` ## 二. 名称空间和作用域 1. 名称空间 1. 内置名称空间 1. 全局名称空间 1. 局部名称空间 2. 作用域 1. 全局作用域 2. 局部作用域 3. 名称空间的查询 1. globals:查询全局名称空间的名字 2. locals:查询局部名称空间的名字 ## 三. 函数的嵌套及静态作用域 1. 嵌套调用 2. 嵌套定义 !!!函数嵌套时的执行顺序 ```python def f1(): x = 1 print('----->f1 ',x) def f2(): x = 2 print('---->f2 ',x) def f3(): x = 3 print('--->f3 ',x) f3() f2() f1() >>>----->f1 1;---->f2 2;--->f3 3 ``` ## 四.函数是第一类对象的概念 1. 函数可以被赋值 ```python def foo(): print('foo') print(foo) f = foo print(f) ``` 1. 把函数当成参数传递 ```python def foo(): print('foo') def bar(func): >>>;foo print(func) func() bar(foo) ``` 1. 把函数当成返回值 ```python def foo(): print('foo') def bar(func): print(func) return func f = bar(foo) print(f) ``` 2. 把函数当成容器类型的元素去用 ```python def add(): print('==========function add') def delete(): print('==========function delete') def search(): print('==========function search') def change(): print('==========function change') def tell_msg(): msg = ''' delete:删除 add:添加 search:查询 change:更改 ''' print(msg) cmd_list = { 'add':add, 'delete':delete, 'search':search, 'change':change } while True: tell_msg() choice = input('please input your choice: ').strip() cmd_list[choice]() ``` ## 五.闭包 1. 闭包函数概念: * 首先是内部定义的函数,该函数对外部作用域而不是全局作用域名字的引用 ```python x =1 def f1(): x = 1000 def f2(): print(x) return f2 f = f1() f() print(f.__closure__[0]) print(f.__closure__[0].cell_contents) >>>>> >>>1000 ``` ```python from urllib.request import urlopen def f1(url): def f2(): print(urlopen(url).read()) return f2 baidu = f1('http://www.baidu.com') #爬网页 baidu() ```

posted @ 2017-11-13 11:08  LexSama  阅读(101)  评论(0编辑  收藏  举报