#!/usr/bin/env python # -*- coding:utf-8 -*- #笔记大纲 #1.函数对象(内存中的地址或映射),能够当作数据传递 #函数对象能够被调用 # def foo(): # print("this is a test") # # foo1 = foo #把函数对象赋值给一个变量 # foo1() #---->foo()函数执行 #能够当作参数传递 # def foo1(args): #此处args的是foo2函数对象 # print(args) # args() #------>foo2()函数的调用 # # def foo2(): # print("this is foo2") # # foo1(foo2) #---->把foo2函数对象当作参数传递给foo1,最后实质是先print,而后args()--->foo2() #返回值能够是函数 # def foo(): # print('from foo') # # def bar(func): # return func #--->返回传入函数对象 # # f=bar(foo) #---->把foo函数对象传入bar函数赋值给变量f,f实质仍是foo函数对象,f()调用函数执行的是foo() # # print(f) #---->打印的是foo函数对象 # # f() #---->foo() #能够当作容器类型的元素 # def andy(): # print("this is andy") # # def yang(): # print("this is yang") # # test_l = { # "andy":andy, #--->此处andy是函数对象 # "yang":yang, #--->此处yang是函数对象 # } # # while True: # chei = input(">> ").strip() # if chei in test_l: # test_l[chei]() #---->此处是经过字典的键取到对应的函数对象,而后加上()调用 # else: # break #2.函数的嵌套 # def foo5(): # def foo6(): # print("this is foo6") # def foo7(): # print("this is foo7") # foo7() # foo6() # # foo5() #正常 #foo6() #此处报错,foo6()为内部函数只能在函数内部使用,当函数执行完成即销毁 #3.名称空间和做用域 #名称空间(定义名字的方法,名称到对象的映射,这就像是字典,键名是变量名,值是变量的值) import time # name = 'andy' # def func(): # pass # class Foo(): # pass #名称空间的分类 #1.内置名称空间:随着python的解释器的启动而启动 # print(sum) # # import builtins # for i in dir(builtins): #查看内置名称空间 # print(i) #2.全局名称空间:文件的执行会产生全局名称空间,指的是文件级别定义的名字都会放入该空间 # x=1 #全局名称空间 # def func(): # money=2000 #---->局部名称空间 # x=2 #---->局部名称空间 # print('func') # print(locals()) #---->{'x': 2, 'money': 2000}局部名称空间名字 # print(x) # print(func) # # print(money) # # func() # print(x) # # #print(globals()) === print(locals()) #由于全局名称空间对于它自己来讲也是一个局部,所以此处打印全局名称空间和局部名称空间是同样的 #局部名称空间:调用函数时会产生局部名称空间,只在函数调用时临时绑定,调用时结束 # x=10000 # def func(): # x=1 # def f1(): # print("this is %d" %(x)) # f1() # func() #---->legb规则(locals -> enclosing function -> globals -> __builtins__) # # print(x) #---->输出10000,由于x=1是局部名称空间,因此在函数执行完成以后,就销毁 #做用域 #全局做用域:内置名称空间,全局名称空间 #局部做用域:局部名称空间 #全局做用域:全局有效,在任何位置都能被访问到,除非del删掉,不然会一直存活到文件执行完毕 #局部做用域的名字:局部有效,只能在局部范围调用,只在函数调用时才有效,调用结束就失效 #查看全局做用域内的名字:gloabls() #查看局局做用域内的名字:locals() # gx = 1000 #全局做用域的全局名称空间 # def gfoo(): # gx = 2000 #局部做用域的局部名称空间,函数执行完则销毁 # def lfoo(): # print(gx) # print(locals()) # # lfoo() # # print(locals()) #---->等于print(globals()) # gfoo() # print(gx) #4.闭包函数(惰性计算)(定义在函数内部,包含对外部做用域而非全局做用域的引用) # def bibao(x): # def relb(): # z = x + 1 # return z # return relb #将这个局部函数对象返回,以便在全局做用域调用 # # ssg = bibao(4) #---->relb函数对象 # print(ssg()) # def bibao2(): # x = 5 # def bibao3(): # return x + 3 # return bibao3 # # sp = bibao2() # print(sp()) # from urllib.request import urlopen # def contr(url): # def wraper(): # conts = urlopen(url).read() # return conts # return wraper # # sycont = contr("http://www.baidu.com") # print(sycont().decode('utf-8')) #5.装饰器函数(就是对闭包的一种实现,把装饰器下面的函数当成参数传递,对已有函数添加新的功能,装饰器自己能够是任何可调用对象(加()能够被执行),被装饰的对象也能够是任意可调用对象) import time from urllib.request import urlopen # def newb(func): # def newbi(): # start_time = time.time() # func() #--->index() # stop_time = time.time() # print("spent times: %s" %(stop_time-start_time)) # return newbi # # #@newb #--->index=newb(index) # def index(): # time.sleep(2) # print("welcome to my page") # # # index() #----->index=newbi # # f = newb(index) #---->f ==newbi函数对象,由于newb()执行返回的结果是newbi函数对象 # print(f) #----->f就是newbi函数对象 # f() #---->f()等于newbi() #被装饰的函数有返回值 # def zhuangsq(func): # def fuck(*args,**kwargs): # stime = time.time() # news = func(*args,**kwargs) #----->yang() # etime = time.time() # print("spent times:%s" %(etime-stime)) # return news # return fuck # # @zhuangsq # def andy(): # time.sleep(2) # print("this is andy") # # @zhuangsq #--->yang=zhuangsq(yang)--->fuck函数对象 # def yang(name): # time.sleep(3) # print("this is yang") # # andy() # yang("zhangyou") # ---->fuck('zhangyou') # # def zhuans(func): # def wrapper(): # startime = time.time() # scont = func() # stoptime = time.time() # print("spent times: %s" %(stoptime-startime)) # print(scont) # return wrapper # # @zhuans # ---->geturl=zhuans(geturl) # def geturl(): # time.sleep(10) # sp = urlopen("http://www.baidu.com").readline() # return sp.decode('utf-8') # # geturl() #对已有函数添加用户名和密码认证功能 # userdb = { # "name":None, # "status":False # } # # # def auth(func): # def wrapper(*args,**kwargs): # if userdb["name"] and userdb["status"]: # res = func(*args,**kwargs) # return res # else: # name = input(">> ").strip() # password = input(">> ").strip() # if name == "andy" and password == "123": # userdb["name"]="andy" # userdb["status"]=True # res = func(*args, **kwargs) # return res # else: # print("login failed!") # return wrapper # # # @auth # def mypage(): # print("this is my homepage") # # @auth # def mainpage(name): # print("this is my mainpage %s" %(name)) # # mypage() # mainpage("andy") #有参装饰器叠加 # userdb = { # "name":None, # "status":False # } # # def timer(func): # def newt(*args,**kwargs): # stime = time.time() # func(*args,**kwargs) # etime = time.time() # print("spent time:%s" %(etime-stime)) # return newt # # def choi(driver): # def auth(func): # def wrapper(*args,**kwargs): # if driver=="file": # if userdb["name"] and userdb["status"]: # res = func(*args,**kwargs) # return res # else: # name = input(">> ").strip() # password = input(">> ").strip() # if name == "andy" and password == "123": # userdb["name"]="andy" # userdb["status"]=True # res = func(*args, **kwargs) # return res # else: # print("login failed!") # elif driver=="mysql": # print("this is mysql auth") # else: # print("unkown auth") # return wrapper # return auth # # @timer # @choi("mysql") #--->auth---mypage = wrapper(mypage)--->index=wrapper # def mypage(): # print("this is my homepage") # @timer # @choi("file") # def mainpage(name): # print("this is my mainpage %s" %(name)) # # mypage() # mainpage("andy") #6.迭代器(内置__iter__方法的,都是可迭代的对象,执行__iter__方法获得的结果就是迭代器,迭代器对象有__next__方法;对于没有索引的数据类型,必须提供一种不依赖索引的迭代方式) # h = [1,2,3] # m = h.__iter__() # print(next(m)) # print(next(m)) # print(next(m)) # j = {"a":1,"b":2,"c":3} # n = iter(j) #此处n是迭代器 # print(n) # key = next(n) # print(j[key],key) # print(next(n)) # print(next(n)) #判断数据类型是不是能够被迭代或者是迭代器(文件是可迭代对象自己也是迭代器,对迭代器使用iter方法获得的仍是迭代器自己) from collections import Iterable,Iterator # f=open('a.txt','w') # print(isinstance('abc',Iterable)) # print(isinstance([],Iterable)) # print(isinstance((),Iterable)) # print(isinstance({'a':1},Iterable)) # print(isinstance({1,2},Iterable)) # print(isinstance(f,Iterable)) # print(isinstance('abc',Iterator)) # print(isinstance([],Iterator)) # print(isinstance((),Iterator)) # print(isinstance({'a':1},Iterator)) # print(isinstance({1,2},Iterator)) # print(isinstance(f,Iterator)) #7.生成器函数(只要函数体包含yield关键字,该函数就是生成器函数,生成器也是迭代器,至关于yield为函数封装好了__iter__和__next__方法) # def foo12(): # print("first") # yield 1 # print("second") # yield 2 # print("third") # yield 3 # # hk = foo12() #此处hk是生成器对象 # for i in hk: # print(i) # print(next(hk)) # print(next(hk)) # print(next(hk)) #tail -f a.txt|grep "python" #定义2个生成器,一个用于输出最后一行的内容,一个用于查找关键字 # def readt(name): # with open(name,"r",encoding='utf-8') as f: # f.seek(0,2) # while True: # m = f.readline().strip() # if m: # yield m # else: # time.sleep(0.2) # # # t = readt("a.txt") #--->生成生成器对象 # # # print(t) # # # # for line in t: # # print(line) # # def grep(pattern,lines): # for line in lines: # if pattern in line: # yield line # # # g=grep('python',readt('a.txt')) # # print(g) # for i in g: # print(i) #8.内置函数 # print(dir(__builtins__)) # # for h in dir(__builtins__): #查看内置函数的方法 # print(h) # # help(sum) #查看具体函数的帮助 #查看一个对象下面的属性 # list_a = [] # print(dir(list_a)) #zip(将多个能够迭代对象中的元素一一对应并生成元组) # s = "andy" # b = "1234" # t = "wesr" # z = zip(s,b,t) # for i in z: # print(i) #eval将字符串中的命令转换出来执行 # dic="{'a':1,'b':2}" # d=eval(dic) # print(type(d),d['a'])