码迷,mamicode.com
首页 > 编程语言 > 详细

Python全栈之路Day19

时间:2017-11-13 14:04:13      阅读:237      评论:0      收藏:0      [点我收藏+]

标签:位置   域名   容器类   oba   while   pre   one   def   div   

初次编辑2017年10月25日,星期三

摘要

引用:Alex

  1. 名称空间和作用域
  2. 函数嵌套及静态嵌套域
  3. 函数对象与闭包

一. 上节课复习

  1. 为何要使用函数
    1. 解决代码重用问题
    2. 统一维护
    3. 程序的组织结构清晰,可读性强
  2. 定义函数
    1. !!!先定义后使用
      def funcname(arg1,arg2,….) #funcname = 函数体
      ‘‘‘描述信息‘‘‘
      函数体
      return value
    2. 定义无参函数
      定义有参函数
      定义空函数
  3. 调用函数
    1. 语句形式:foo()
    2. 表达式形式:foo(1,2)
    3. 函数调用作为另外一个函数的参数:print(foo(1,2))
  4. 函数返回值
    1. 不写return--->None
    2. return 一个值--->这个值
    3. return 多个值--->由这多个值组成的元组
  5. 函数的参数
    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)
      • 什么时候用:
        • 在调用函数时,每次调用传入的值都在变化,使用位置参数,变化较小使用默认参数
      • 二者的位置排列:
        • 位置参数必须在默认参数的左边
      • 二者的特性:
        • 位置参数 必须传值,默认参数可传可不传
      1. *args: def foo (x,*args)
        foo(1,2,3,4,5)
        ** kwargs: def foo (x,**kwargs)
        foo(1,y=2,z=3)

二. 名称空间和作用域

  1. 名称空间
    1. 内置名称空间
    2. 全局名称空间
    3. 局部名称空间
  2. 作用域
    1. 全局作用域
    2. 局部作用域
  3. 名称空间的查询
    1. globals:查询全局名称空间的名字
    2. locals:查询局部名称空间的名字

三. 函数的嵌套及静态作用域

  1. 嵌套调用
  2. 嵌套定义 !!!函数嵌套时的执行顺序
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. 函数可以被赋值
def foo():
    print(‘foo‘)

print(foo)

f = foo
print(f)
  1. 把函数当成参数传递
def foo():
    print(‘foo‘)

def bar(func):        >>><function foo at 0x00000000003E3F28>;foo
    print(func)
    func()

bar(foo)
  1. 把函数当成返回值
def foo():
    print(‘foo‘)

def bar(func):
    print(func)
    return func

f = bar(foo)
print(f)
  1. 把函数当成容器类型的元素去用
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. 闭包函数概念:
    • 首先是内部定义的函数,该函数对外部作用域而不是全局作用域名字的引用
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
>>><cell at 0x0000000002177498: int object at 0x0000000001DC9EF0>
>>>1000
from urllib.request import urlopen
def f1(url):
    def f2():
        print(urlopen(url).read())
    return f2

baidu = f1(‘http://www.baidu.com‘)        #爬网页
baidu()

作业

今日总结

  1. 待整理

Python全栈之路Day19

标签:位置   域名   容器类   oba   while   pre   one   def   div   

原文地址:http://www.cnblogs.com/sama/p/7825399.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!