# 命名关键字参数: 在定义函数时,*与**之间参数称之为命名关键字参数
# 特点:
# 在调用函数时,命名关键字参数必须按照key=value的形式传值
#
# def func(x,*,y=1,z):
# print(x)
# print(y)
# print(z)
#
# func(1,z=2)
#
#
# def func(a,b=2,*args,c,**kwargs):
# print(a)
# print(b)
# print(args)
# print(c)
# print(kwargs)
# 函数是第一类对象: 指的是函数的内存地址可以像一个变量值一样去使用
#
def foo(): #foo=函数的内地址
print('from foo')
#
# 1. 变量值可以被引用
# x=1 #foo=函数的内地址
# y=x
# f=foo
# print(f)
# f()
#
# 2. 变量值可以当作参数传给另外一个函数
# def bar(x):
# print(x)
# x()
#
# x=11111 #foo=函数的内存地址
# bar(x)
# bar(foo)
#
# 3. 变量值可以当作函数的返回值
# def func(x):
# return x
#
# f=func(foo)
# print(f)
#
# 4. 变量值可以当作容器类型的元素
# l=[foo,]
# print(l)
# l[0]()
#
dic={'1':foo}
print(dic)
dic['1']()
#
# def register():
# print('注册....')
#
# def login():
# print('登录....')
#
# def pay():
# print('支付....')
#
# def transfer():
# print('转账....')
#
# func_dic={
# '1':register,
# '2':login,
# '3':pay,
# '4':transfer
# }
#
# func_dic['1']()
#
# while True:
# print("""
# 0 退出
# 1 注册
# 2 登录
# 3 支付
# 4 转账
# """)
# choice=input('请输入你的操作: ').strip()
# if choice == '0':break
#
# if choice not in func_dic:
# print('输错的指令不存在')
# continue
#
# func_dic[choice]()
# 函数的嵌套调用:在一个函数内部又调用其他函数
# def max2(x,y):
# if x > y:
# return x
# else:
# return y
#
# def max4(a,b,c,d):
# res1=max2(a,b)
# res2=max2(res1,c)
# res3=max2(res2,d)
# return res3
#
# print(max4(1,2,3,4))
#
# 函数的嵌套定义: 在函数内又定义了其他函数
def func():
def foo():
print('from foo')
print(foo)
foo()
x=1
print(x)
func()
#
#
# from math import pi
#
# def circle(radius,action):
# def cal_perimeter():
# return 2 * pi * radius
#
# def cal_area():
# return pi * (radius ** 2)
#
# if action == 1:
# res=cal_perimeter()
# elif action == 2:
# res=cal_area()
# return res
#
# res=circle(10,1)
# print(res)
#
#
# '''
# 一 名称空间相关
# 1. 名称空间Namespaces:指的就是存放名字与值内存地址绑定关系的地方(内存空间)
# x=1
#
# 2. 名称空间分为三大类
# 内置名称空间: 存放的是python解释器自带的名字
# 产生:python解释器的启动则产生
# 销毁:python解释器关闭则销毁
#
# 全局名称空间: 在顶级定义的名字
# x=1
# if True:
# y=2
# while True:
# while True:
# while True:
# z=3
# def func():
# pass
#
# 产生:执行python程序时产生
# 销毁:python程序执行完毕后则销毁
#
#
# 局部名称空间: 在函数内定义的名字
# def foo():
# m=100
#
# foo()
# 产生: 在函数调用时临时产生
# 销毁: 在函数调用完毕后则销毁
#
#
# 三种名称空间的产生的先后顺序: 内置->全局->局部
# 查找名字的顺序:从当前位置往外一层一层查找
# 如果当前在局部名称空间: 局部->全局->内置
# 如果当前在全局名称空间: 全局->内置
#
#
# # len=111
# # def foo():
# # # len=222
# # print(len)
# # len=111
# # foo()
#
#
# x=0
# def f1():
# x=1
# def f2():
# x=2
# def f3():
# x=3
# print(x)
# f3()
# f2()
# f1()
# #
#
# def foo1():
# def foo2():
# def foo3():
# print(x)
#
# '''
#
# 二 作用域:指的是作用范围
# 全局作用域:包含内置与全局名称空间的名字
# 特点:全局存活,全局有效
# 局部作用域:包含局部名称空间的名字
# 特点:临时存活,局部有效
# '''
# #全局作用域:包含的是内置名称空间与全局名称空间的名字,
# #特点
# #1在任何位置都能够访问的到
# #2该范围内的名字会伴随程序整个生命周期
#
# #局部作用域:包含的是局部名称空间的名字
# #特点:
# #1、只能在函数内使用
# #2、调用函数时生效,调用结束失效
# '''
#
# !!!作用域关系是在函数定义阶段就已经固定死了,与调用位置无关
# 示范一:
# def f1():
# print(xxx)
# xxx=111
#
# def f2():
# xxx=222
# f1()
#
# f2()
#
# 示范二:
xxx=111
yyy=333
def f1():
xxx=222
print(xxx)
# xxx=222
yyy=222
print(yyy)
f1()
闭包函数:
# 闭:封闭,指的是该函数是定义一个函数内部的函数
# 包:该内部函数包含对外层函数名字的引用
#
# def outter():
# x=1
# def inner():
# print('from inner',x)
# return inner
#
#
# f=outter()
#
# def foo():
# # print(f)
# x=111111111111111111111111111111111111
# f()
# foo()
#
#
# 为函数体传值的两种方式:
# def foo():
# print('hello %s' %name)
#
# 方式一:直接以参数的形式传入
# def foo(name):
# print('hello %s' %name)
#
# foo('egon')
# foo('egon')
# foo('egon')
#
# 方式二:闭包函数
# def outter(name):
# # name='egon'
# def foo():
# print('hello %s' %name)
# return foo
#
# f=outter('egon')
# # print(f)
# f()
# f()
# f()
#
# f1=outter('alex')
# f1()
# f1()
# f1()
#
#
# pip3 install requests
# import requests
#
# 问题
# def get():
# response=requests.get(url)
# if response.status_code == 200:
# print(response.text)
#
# 解决方案一:
# def get(url):
# response=requests.get(url)
# if response.status_code == 200:
# print(response.text)
#
# get('https://www.baidu.com')
# get('https://www.baidu.com')
# get('https://www.baidu.com')
#
# 解决方案二:
#
# def outter(url):
# # url='https://www.baidu.com'
# def get():
# response=requests.get(url)
# if response.status_code == 200:
# print(response.text)
# return get
#
# baidu=outter('https://www.baidu.com')
# cnblogs=outter('https://www.cnblogs.com')
#