python学习之函数学习进阶

1.名称空间

python有三种名称空间
内置名称空间: 随着python解释器的启动而产生
print(sum)
print(max)

全局名称空间: 文件的执行会产生全局名称空间,指的是文件级别的定义名字都会放入该空间
x = 11
if x == 11:
    print(x)

局部名称空间: 调用函数时会产生局部名称空间,只在函数调用时临时绑定,调用结束时解绑
x = 1000
def foo():
    x = 1
    print(x)
foo()
print(x)

作用域:
    1.全局作用域: 内置名称空间,全局名称空间,全局有效,在任何位置都能被访问到,
    除非del删除,否则存活到文件结束。
    2.局部作用域: 局部名称空间,局部有效,只能在局部范围调用,调用结束失效。

名字的查找顺序: 局部名称空间-->全局名称空间-->内置名称空间
x = 1000
def func():
    x = 2
    print(locals())    #locals()查看局部作用域内的名字
print(globals())    #globals()查看全局作用域内的名字

2.函数对象
    1.可以被引用
    2.可以当作参数传递
    3.返回值可以是函数
    4.可以当作容器类型的元素
    
 例子:
     def foo():
         print("from foo")
     func = foo
     print(foo)
     print(func)
     foo()
     func()
     
     def foo():
         print("from foo")
     def bar(func):
         print(func)
         func()
     bar(foo)
     
     def foo():
         print("from foo")
     dic = {‘func‘: foo}
     print(dic[‘func‘])
     dic[‘func‘]()
     
     
     
3.闭包函数
    闭包:
      1.定义在内部函数
      2.包含对外部作用域而非全局作用域的引用
  该内部函数就称作闭包函数
  例子:
  def f1():
    x = 1
    def f2():     #f2称作闭包函数
      print(x)
    return f2
  f = f1()
  print(f)   #打印f2函数的内存地址
  f()    #打印1
 
   例子:
   from urllib.request import urlopen
   def index(url):
       def get():
           return urlopen(url).read()
       return get
   oldboy = index(‘http://www.baidu.com‘)
   print(oldboy().decode(‘utf-8‘))
   print(oldboy.__closure__[0].cell_contents)    #打印外部引用而非全局引用对象
   
4.装饰器
    修饰其他对象的工具,修饰添加功能,工具指的是函数。
    装饰器本身是任何可调用对象,被装饰的对象也可以是任何可调用的对象。
    
    为什么要用装饰器?
    开放封闭原则,对修改是封闭的,对扩展是开放的。
    装饰器就是为了在不修改被装饰对象源代码以及调用方式的前提下,为其添加新功能
    
    装饰器相当于闭包的实现
    
    例子:
    import time
    def timmer(func):
        def wrapper(*args, **kwargs):
            start_time = time.time()
            res = func(*args, **kwargs)
            stop_time = time.time()
            print("run time is {0}".format(stop_time - start_time))
        return wrapper
        
    @timmer        #相当于index = timmer(index)
    def index():
        time.sleep(3)
        print("welcome to index")
        return 1
        
    index()    #其实相当于执行了timmer(index)
    
    例子:
    import time
    def timmer(func):
        def wrapper(*args, **kwargs):
            start_time = time.time()
            res = func(*args, **kwargs)
            stop_time = time.time()
            print("run time is {0}".format(stop_time - start_time))
        return wrapper
        
    def index():
        time.sleep(3)
        print("welcome to index")
    
    f = timmer(index)
    print(f)
    f()        #f()<=====>wrapper()
    
    
    认证用户登录
    login_user = {‘user‘: None, ‘status‘: False}
    def auth(func):
        def wrapper(*args, **kwargs):
            if login_user[‘user‘] and login_user[‘status‘]:
                res = func(*args, **kwargs)
                return res
            else:
                name = input("请输入姓名:")
                passwd = input("请输入密码:")
                if name == "hyh" and passwd == "123":
                    login_user[‘user‘] = "hyh"
                    login_user[‘status‘] = True
                    print("\033[45mlogin successful\033[0m")
                    res = func(*args, **kwargs)
                    return res
                else:
                    print("\033[45mlogin err\033[0m")
        return wrapper
        
   @auth
   def index():
       print("welcome to index page")
       
   @auth
   def home(name):
       print("%s welcome to home page" % (name)) 
       
   index()
   home("hyh")
   
5.迭代器
    迭代器的概念: 重复上一次迭代的结果为下一次迭代的初始值,重复的过程称为迭代,
    每次重复即一次迭代
    
    为什么要有迭代器?
    对于没有索引的数据类型,必须提供一种不依赖索引的迭代方式
    
    可迭代对象: 内置__iter__方法的都是可迭代对象
    [1,2].__iter__()
    ‘hello‘.__iter__()
    (1,2).__iter__()
    {"a":1, "b": 2}.__iter__()
    {1,2,3}.__iter__()
    
    迭代器: 执行__iter__()方法,得到的结果就是迭代器,迭代器有__next__()方法
    i = [1,2,3].__iter__()
    print(i.__next__())        #打印1
    print(i.__next__())        #打印2
    print(i.__next__())        #打印3
    print(i.__next__())    #抛出异常
    
    i__iter__() <==>iter(i)
    i__next__() <==>next(i)
    
    如何判断一个对象是可迭代对象,还是迭代器对象
    from collections import Iterable, Iterator
    print(isinstance(‘abc‘,Iterable))
    print(isinstance([],Iterable))
    print(isinstance((),Iterable))
    print(isinstance({‘a‘:1},Iterable))
    print(isinstance({1,2},Iterable))
    f=open(‘a.txt‘,‘w‘)
    f.__iter__()
    print(isinstance(f,Iterable))    #只有文件是迭代器对象
    
    可迭代对象:只有__iter__方法,执行该方法得到的迭代器对象
    迭代协议:
        对象有__next__
        对象有__iter__,对于迭代器对象来说,执行__iter__方法,得到的结果仍然是它本身
        
    迭代器的优点和缺点
        优点:
            1.提供了一种不依赖下标的迭代方式
            2.就跌迭代器本身来说,更节省内存

        缺点:
            1. 无法获取迭代器对象的长度
            2. 不如序列类型取值灵活,是一次性的,只能往后取值,不能往前退
时间: 2024-10-27 15:47:55

python学习之函数学习进阶的相关文章

python学习之函数学习进阶(二)

一.内置函数 zip函数: zip()是Python的一个内建函数,它接受一系列可迭代的对象作为参数,将对象中对应的 元素按顺序组合成一个tuple,每个tuple中包含的是原有序列中对应序号位置的元素,然后返回由 这些tuples组成的list.若传入参数的长度不等,则返回list的长度和参数中长度最短的对象相同. 在所有参数长度相同的情况下,zip()与map()类似,没有参数的情况下zip()返回一个空list 例子: l1 = [1,2,3,4] l2 = ['a','b','c','d

python 使用lambda函数 和 list comprehension

python 使用lambda函数 学习资源 lambda函数学习 list comprehension 多维数组初始化 lambda 函数 Python 支持一种有趣的语法,它允许你快速定义单行的最小函数.这些叫做 lambda 的函数,是从 Lisp 借用来的,可以用在任何需要函数的地方. def f(x): return x*2,用lambda函数来替换可以写成:g = lambda x: x*2`g(3)结果是6.(lambda x: x*2)(3)`也是同样的效果. 这是一个 lamb

[Python]学习基础篇:函数的进阶篇

对于函数大家都熟知不过了,但是对于一些函数还是费力的理解,下来我们来看看Python自带的一些函数,在此之前,还是请大家了解什么是高阶函数. 高阶函数:函数中的高阶函数 map()函数 格式:map(func,seq) 返回值:list map函数的作用是将参数函数func作用于seq中的每一个元素,每个元素产生的结果存放进list中. 例如:我们以函数func=x+x*x为例,作用于序列[1,2,3,4,5,6,7,8]上 !/bin/python def func(x):     retur

python常用内置函数学习(持续更新...)

python常用内置函数学习 一.python常用内置函数有哪些 dir() 二.每个内置函数的作用及具体使用 1.dir()不带参数时返回当前范围内(全局.局部)的变量.方法和定义的类型列表:   带参数A时返回参数的属性.方法的列表,如何该参数A对象有__dir__(),该方法被调用,如果不含有该方法,该方法不会报错,而是尽可能多的收集参数对象A的信息   实例: 不带参数,在分别在文件全局调用和在函数中局部调用dir()   带参数   原文地址:https://www.cnblogs.c

基础学习之第十天(函数的进阶)

函数的进阶顺序:位置参数->动态接收位置参数*->默认值->动态接收关键字参数**     位置参数->*args->默认参数值->**kwargs一.函数参数--动态传参 1.动态接受位置参数 在参数位置编写*表示接收任意内容 动态接收参数的时候要注意:动态参数必须在位置参数后面 2.动态接收关键字参数 动态接收关键字参数一定在最后面 在实参位置使用*或**,他们是用来打散列表和字符串的二.名称空间,局部名称空间,作用域,加载顺序 在python解释器开始执行之后,

python学习系列--python内置函数(一)

先列出所有的python内置函数,可以看到还是挺多的. abs()        求给定数的绝对值. all()          传入一个列表,只有当列表中所有元素都是真时,该函数返回真. any()        传入一个列表,只要列表中有一个元素为真,该函数即返回真. ascii()       执行对象中的__repr__方法.该函数在python2.7中已弃用. bin()         将给定的值转换成二进制. bool()       判断真假. bytearray()     

python 学习笔记 函数和类

与java类似 python的函数也是出于可以复用才使用的 如果一段代码没有复用的价值就可以不用函数 一般的函数可以定义成这样: def func(a,b=123,*arg,**args): for x in arg:#arg是一个list print x for x,y in args.items():#args是一个dict print x,y print 'a:',a print 'b:',b func(1,1,2,3,4,c=1,d=2) 结果: 2 3 4 c 1 d 2 a: 1 b

python的函数学习

函数和过程   过程就是没有返回值的函数  两者都能 调用 在python中,函数返回值为return后面的值,而过程返回值为 None 编程方式:面向对象.面向过程.函数式编程 面向过程编程:就是通过一个个def所定义的小过程而拼接到一块 函数式编程:f =2x 数学上的函数 有一个x,就会有对应的一个f值 比如:lisp.erlang 比如:像python 语言的函数,是存在真假判断的,也就是一个x不一定对应一个f 如下例:要计算(1+2)*3-4 传统方式: var  a =1+2; va

Python学习之函数篇

python查看对象,函数帮助文档:.__doc__,例:str.split.__doc__ 查看详细对象,函数文档:help(),例:help(str.split) 函数参数可设置默认值 如果不能提前确定参数个数,可以采用可变参数,因此,python不必支持函数的重载,更简单,更方便的实现重载 函数示例: 求最大公约数.最小公倍数函数封装 原文地址:https://www.cnblogs.com/baobao2201128470/p/10884153.html