# 函数 # 可读性强 复用性强 # def 函数名(): # 函数体 #return 返回值 # 所有的函数 只定义不调用就一定不执行 #先定义后调用 #函数名() #不接收返回值 #返回值 = 函数名() #接收返回值 #返回值 # 没有返回值 :默认返回None # 不写return:函数内的代码执行完毕自动结束 # 只写return:结束一个函数 # return None # 返回一个值 :结束了函数且返回一个值,可以是任意的值 # 返回多个值 : 多个值之间用逗号隔开,接收的时候可以用一个变量接收(元祖),也可以用等量的多个变量接收 # def f(a): # return '栗子' # # ret = f('苹果') # print(f('苹果')) #参数 #形参 定义函数的时候 # 位置参数 :必须传 # *args :动态参数 可以接收任意多个按位置传入的参数 # 默认参数 : 可以不传 —— 陷阱 # def qqxing(k,l = {}): # # l.append(1) # l[k] = 'v' # print(l) # # qqxing(1) #[1] # qqxing(2) #[1,1] # qqxing(3) #[1,1,1] # # 如果默认参数的值是一个可变数据类型, # 那么每一次调用函数的时候, # 如果不传值就公用这个数据类型的资源 # **kwargs : 动态参数 可以接受任意多个按关键字传入的参数 #实参 调用函数的时候 # 按照位置传参数 # 按照关键字传参数 # 可以混用 位置参数必须在关键字传参之前 # 不能对一个参数重复赋值 # def 娃哈哈(*args): # print(args) # # # 娃哈哈(1,2,3,4) # l = [1,2,3,4] # 娃哈哈(*l) # #函数的命名空间和作用域 # a = 1 # def func(): # print(a) # func() # print() # input() # list # tuple # 命名空间有三种 # 内置命名空间----哦樱桃红解释器 #就是python解释器一启动就可以使用的函数名字 #函数 启动时就被加载进了内存里 #全局命名空间----就是自己写的代码 #是按照从上到下的顺序加载到内存里的 #放置了我们自己所设置的所有变量名和函数 #局部命名空间 #就是函数内部定义的变量 #当函数被调用的时候才会产生,随着函数的结束而释放 # 在局部:可以使用全局、内置 # 在全局:可以使用内置 # 在内置:不能使用局部、内置 # def func(): # a = 1 # func() # print(a) #全局中不能使用局部变量 # def len(l): #当我们定义了和内置空间相同的名字时,先用我们自己的 # print('in max func') # print(len([1,2,3])) # def input(): # print('in input now') # def func(): # print(input()) # func() # func---->函数的内存地址 # 函数名()--->函数的调用 # 函数的内存地址()--->函数的调用 #作用域 #全局作用域----globals() #局部作用域----locals() # a = 1 # def func(): # global a #修改全局变量 # a = 2 # func() # print(a) #对于不可变数据类型,可在局部查看但不可修改, # 如果想要修改就必须在之前家global # a = 1 # b = 2 # def func(): # x = 'aaa' # y = 'bbb' # print(locals()) #打印的是内存地址 # print(globals()) #打印的是内存地址 # func() # print(globals()) #打印的是内存地址 # print(locals()) #打印的是内存地址 # a = 1 # def func(a): # a =2 # return a # a =func(a) # print(a) # globals永远打印全局的名字 # locals打印什么是基于它的位置 #函数的嵌套 # def max(a, b): # return a if a > b else b # # def the_max(x,y,z): #函数的嵌套调用 # c=max(x,y) # return max(c,z) # print(the_max(1,2,3)) #函数的嵌套定义 #在内部函数中可以使用外部函数的变量 # a = 1 # def outer(): # a = 1 # def inner(): # a =2 # def inner2(): # nonlocal a # a+=1 # inner2() # print('##a##:',a) # inner() # print("**a**",a) # outer() # print('全局:',a) #nonlocal用于寻找最近的局部变量 #对全局无效 #对局部也只对最近的一层生效 # a = 0 # def outter(): # a=1 # def inner(): # a=2 # def inner2(): # nonlocal a # print(a) # inner2() # inner() # outter() # def func(): # print(123) # func() #函数名就是内存地址,并可以进行赋值操作 # func2 = func # l = [func,func2] #函数名可以作为容器类型的元素 # print(l) # for i in l: # i() #执行函数 # def func(): # print(123) # def wahaha(f): # f() # return f #函数名可以当作返回值 # qqxing = wahaha(func) #函数名可以作为函数的参数 # qqxing() #函数的闭包:嵌套函数,在外部直接调用内部函数 # def outer(): # a = 1 # def inner(): # print(a) # inner() # outer() # def outter(): # a = 1 # def inner(): # print(a) # return inner # inn = outter() # inn() from urllib.request import urlopen # ret = urlopen('http://search.chongbuluo.com/').read() # print(ret) # def get_url(): # url='http://search.chongbuluo.com/' # ret=urlopen(url).read() # print(ret) # get_url() def get_url(): url='http://search.chongbuluo.com/' def get(): ret = urlopen(url).read() print(ret) return get get_func = get_url() get_func()