Day09 收集参数、命名关键字、函数名使用、全局变量、局部变量

 收集参数

收集参数:
(1)普通收集参数
(2)关键字收集参数
'''
(1) 普通收集参数 (可变参数)
'''
语法:
def func(*参数):
    pass
    
参数前面加上一个* 的就是普通收集参数;
普通收集参数专门用于收集多余的,没人要的普通实参,形成一个元组

arg => argument 参数
'''
# 函数的定义处
def mysum(*arg):
    total = 0 
    print(arg)
    for i in arg:
        total += i
    print(total)
mysum(1,5,7,1000)
# (1, 5, 7, 1000)
(2) 关键字收集参数
# 语法
def func(**参数):
    pass
参数前面加上**的就是关键字收集参数    
关键字收集参数:用于收集多余的,没人要的关键字实参,形成一个字典

def func(a,b,c,**kwargs):
    pass

kwargs => keyword关键字 arguments多个参数

def func(a,b,c,**kwargs):
    print(a,b,c)
    print(kwargs)
func(1,2,3,f=11,d=13,zz=99)    

# 1 2 3
# {'f': 11, 'd': 13, 'zz': 99}

'''

例2:

# 打印任意长度的字符
# 班长:黄文
# 班花:陈广耀

def func(**kwargs):
    dictvar = {"monitor":"班长","class_flower":"班花"}
    strvar1 = ''
    strvar2 = ''
    print(kwargs)
    # {'monitor': '黄文', 'class_flower': '陈广耀', 'people1': '黄熊大', 'people2': '黄将用'}
    for a, b in kwargs.items():
        if a in dictvar:
            strvar1 += dictvar[a] + ":" + b + '\n'
        else:
            strvar2 += "吃瓜群众:" + b+'\n'
    
    print(strvar1)
    # 班长: 黄文
    # 班花: 陈广耀
    print(strvar2)
    # 吃瓜群众: 黄熊大
    # 吃瓜群众: 黄将用
func(monitor="黄文",class_flower="陈广耀",people1="黄熊大",people2="黄将用")

命名关键字

'''
# 语法:
def func(参数1,参数2,*,参数3,参数4):
    pass
(1)在函数的定义处,* 号后面的参数就是命名关键字参数
(2)在函数的定义处,在普通收集参数和关键字收集参数之间的是命名关键字参数 
def func(*arg,命名关键字参数,**kwargs)

命名关键字必须使用关键字实参的形式进行调用
'''
# 形式1
def func(a,b,*,c):
    print(a,b,c)
func(1,2,c=4)
# 1 2 4
# 形式2
'''
如果命名关键字指定了默认值,那么在调用时,
可以不指定实参.默认使用自己的值
'''
def func(a,b,*,c=5):
    print(a,b,c)
func(1,2,c=6)
# 1 2 6
# 形式3
def func(*arg,d,**kwargs):
    print(arg) # 1 2 23
    print(kwargs) # {c:1,f:2}
    print(d) # d = 3
func(1,2,23,c=1,f=2,d=3)
# (1, 2, 23)
# {'c': 1, 'f': 2}
# 3

(3)*和**的魔术用法:打包和解包

 *和**,在函数的定义处,负责打包(把实参都收集过来,放在元组或字典中)
 *和**,在函数的调用处,负责解包(把容器类型的数据,一个一个拿出来,进行传递)
def func(a,b,c):
    print(a,b,c)

listvar = [1,2,3]
# *一般修饰列表更多一些 (负责把列表里面的元素一个一个拿出来的进行函数调用)
func(*listvar) # <==>  func(1,2,3)
# 1 2 3

def func(a,b,c,*,d,e,f):
    print(a,b,c)
    print(d,e,f)
listvar = [1,2,3]
dic = {"d":4,"e":5,"f":6} # func(d=4,e=5,f=6)
# **一般修饰字典,(负责把字典里面的键值对变成d=4,e=5的形式,进行函数调用)
func(1,2,3,**dic) # <==> d=4 , e = 5 , f = 6
# 1 2 3
# # 4 5 6
# * 和 ** 的解包操作
func(*listvar,**dic)
# 1 2 3
# 4 5 6
# 函数参数的默认顺序:
必须按照如下的参数顺序进行定义:
普通形参(位置形参) -> 默认形参 -> 普通收集参数 -> 命名关键字参数 -> 关键字收集参数
 
def f1(a, b, c=0, *args, **kw):
    print('a =', a, 'b =', b, 'c =', c, 'args =', args, 'kw =', kw)

def f2(a, b, c=0, *, d, **kw):
    print('a =', a, 'b =', b, 'c =', c, 'd =', d, 'kw =', kw)

#(一)
# f1(1, 2) #a=1,b=2,c=0 args=(),kw={}
# f1(1, 2, c=3) #a=1,b=2,c=3,args=(),kw={}
# f1(1, 2, 3, 'a', 'b') #a=1,b=2,c=3,args=(a,b),kw={}
# f1(1, 2, 3, 'a', 'b', x=99) #a=1,b=2,c=3,args=(a,b),kw={'x':99}
# f2(1, 2, d=99, ext=None) # a=1,b=2,c=0,d=99,kw={'ext':None}

#(二)
args = (1, 2, 3, 4)
kw = {'d': 99, 'x': '#'}
f1(*args, **kw) # a=1,b=2,c=3,args=(4,),kw={"d":99,"x":"#"}
# *args <==> f1(1,2,3,4)
# **kw <==> f1(d=99,x="#")

#(三)
def f2(a, b, c=0, *, d, **kw):
    print('a =', a, 'b =', b, 'c =', c, 'd =', d, 'kw =', kw)
myargs = (1, 2, 3)
mykw = {'d': 88, 'x': '#'}
f2(*myargs, **mykw) #a=1,b=2,c=3,d=88,kw={"x":"#"}

#(四)
# 定义处
def f1(a, b, c=0, *args,d,**kw):
    print('a =', a, 'b =', b, 'c =', c, 'args =', args, 'kw =', kw)
    print(d)
# 调用处
f1(1,2,3, 'a', 'b',d=67, x=99,y=77)#a=1,b=2,c=3,args=(a,b) kw={x:99,y:77} d=67

# 普通收集形参 和 关键字收集形参 可以接受到所有种类的参数
# *args,**kwargs 都是可变长参数,参数的长度不限制
def func(*args,**kwargs):
    pass
 

 函数的返回值

1.return 后面的数据类型

"""
return: 自定义返回值 , 返回到哪里? 返回到函数的[调用处]
1.return 后面可以跟上六大标准数据类型 , 除此之外,可以跟上 类对象,函数,如果不写return ,默认返回None
2.return 如果执行了return ,意味着 return后面得所有代码,统统不执行,函数终止了.
"""
def func():
    # return 1
    # return 3.14
    # return True
    # return 4j
    # return [1,2,3,4]
    return {"a":1,"b":2}
res = func() # res = {"a":1,"b":2}
print(res)
# {'a': 1, 'b': 2}
(2) 如果不写return ,默认返回None
def func():
    a =1
res = func()
print(res)
# None
(3) 执行完return 之后,函数立刻终止,后面的代码不执行
def func():
    print("执行到1")
    print("执行到2")
    return 1
    print("执行到3")
    print("执行到4")
    return 2

res = func()
print(res)
# 执行到1
# 执行到2
# 1

(4)注意点:

def calc(sign,num1,num2):
    if sign == "+":
        res = num1 + num2
    elif sign == "-":
        res = num1 - num2
    elif sign == "*":
        res = num1 * num2
    elif sign == "/":
        if num2 == 0:
            return "大兄弟,除数不能为0"
        res = num1 / num2
    else:
        return "不会,别问我!!!!!!,你是有趣的灵魂"
    return res
res = calc("^",5,0)
print(res)
# 不会,别问我!!!!!!,你是有趣的灵魂

# print打印的值和返回值是两个不相干的概念 return + 值 自定义的
函数名的使用
# python中的函数可以像变量一样,动态创建,销毁,当参数传递,作为值返回,叫第一类对象.其他语言功能有限 1.函数名是个特殊的变量,可以当做变量赋值 2.函数名可以作为容器类型数据的元素 3.函数名可以作为函数的参数 4.函数名可作为函数的返回值 __doc__或者help查看文档
1.函数名是个特殊的变量,可以当做变量的赋值
 
 
def func():
print(1)
# 变量的赋值操作
func2 = func
func2() # func()
# 1
 动态的销毁变量
del func2 # del 关键字 用来删除变量的
# func2() # error
 

2.函数名可以作为容器类型数据的元素

def func1():
    print(1)
def func2():
    print(2)
def func3():
    print(3)
def func4():
    print(4)


lst = [func1,func2,func3,func4]
for i in lst:
    # print(i)
    i() # 函数的调用
# 1
# 2
# 3
# 4

 3.函数名作为函数的参数

def func(a): # a = func2
    res = a()
    print(res)
    
def func2():
    return 123
    
func(func2)
# 123

4.函数名可以作为函数的返回值

def func(a): # a = func2  return a <==> return func2
    return a

def func2():
    return 456

# 函数的调用处
res = func(func2) # res = func2
print(res)
# <function func2 at 0x00000000028FB268>
total = res() # res() <==> func2()
print(total)
# 456

5.# __doc__或者help查看文档

#(1) help
# help(print)
#(2)__doc__ 魔术属性
res = print.__doc__
print(res)
# Help on function kao_qiezi in module __main__:
#(3) 自定义函数文档
def kao_qiezi(qimin):
    '''
    功能:告诉你如何做烤茄子
    参数:是一个器皿
    返回值:返回烧烤的状态
    '''
    print("从中间抛开,扔到烧烤架子上面")
    print("扔胡椒面,扔孜然,扔蒜蓉,扔香菜")
    print("用一个%s来盛放" % (qimin))
    return "这个茄子做好了"
kao_qiezi("")
help(kao_qiezi)
# kao_qiezi(qimin)
# #     功能:告诉你如何做烤茄子
# #     参数:是一个器皿
# #     返回值:返回烧烤的状态

局部变量和全局变量

# #3.文件a.txt内容:每一行内容分别为商品名字,价钱,个数。
#     apple 10 3
#     tesla 100000 1
#     mac 3000 2
#     lenovo 30000 3
#     chicken 10 3
#
# 通过代码,将其构建成这种数据类型:[{'name':'apple','price':10,'amount':3},{'name':'tesla','price':1000000,'amount':1}......] 并计算出总价钱。
with open("1.txt", mode="r+", encoding="utf-8") as fp:
    lst = []
    sum = 0
    for line in fp:
        line = line.strip().split()
        # apple 10 3 line = [apple , 10 , 3]
        lst.append({'name': line[0], 'price': line[1], 'amount': line[2]})
        # [ {...}   ,    {....}   ]
        # 单品价格 * 总数 = 总价格(单品)  苹果(10) * 苹果数量(3) = 苹果总价30
        sum += int(line[1]) * int(line[2])
    print(lst)
    # [{'name': 'apple', 'price': '10', 'amount': '3'},
    # {'name': 'tesla', 'price': '100000', 'amount': '1'},
    #  {'name': 'mac', 'price': '3000', 'amount': '2'},
    #  {'name': 'lenovo', 'price': '30000', 'amount': '3'},
    #  {'name': 'chicken', 'price': '10', 'amount': '3'}]
print(sum)
# 196060


with open("1.txt", mode="r+", encoding="utf-8") as fp:
    lst = []
    sum = 0
    for line in fp:
        line = line.strip().split()
        lst.append({'name': line[0],'price': line[1], 'amount': line[2]})
        sum += int(line[1]* int(line[2]))
    print(lst)
print(sum)


# 4.把字符串 "k:1|k1:2|k2:3|k3:4" 处理成字典 {'k':1,'k1':2....}
listvar = {}
strvar = "k:1|k1:2|k2:3|k3:4"
strvar1 = strvar.split("|")
for i in strvar1:
    strvar2 = i.split(":")
    listvar[strvar2[0]] = int(strvar2[1])
print(listvar)
# {'k': 1, 'k1': 2, 'k2': 3, 'k3': 4}
#
# 5.有如下值li= [11,22,33,44,55,66,77,88,99,90]
# '''
#  将大于 66 的值保存至字典的k1键中,
#  将小于 66 的值保存至字典的k2键中。
#  即: {'k1': 大于66的所有值列表, 'k2': 小于66的所有值列表}
# '''
li = [11, 22, 33, 44, 55, 66, 77, 88, 99, 90]
dictvar = {'k1': [], 'k2': []}

for i in li:
    if i > 66:
        dictvar['k1'].append(i)
    elif i < 66:
        dictvar['k2'].append(i)

print(dictvar)
# {'k1': [77, 88, 99, 90], 'k2': [11, 22, 33, 44, 55]}
strvar = "{who:*^10}在长春长生{something:>>10},心情{feel:!<10}"
res = strvar.format(who="潘伟成",something="扎一打疫苗", feel="爽歪歪")
print(res)
# ***潘伟成****在长春长生>>>>>扎一打疫苗,心情爽歪歪!!!!!!!
strvar = "姚承政买了{:3d}个兰博基尼"
res = strvar.format(10)
print(res)
# 姚承政买了 10个兰博基尼
# :^3d
strvar = "姚承政买了{:<3d}个兰博基尼"
res = strvar.format(10)
print(res)
# 姚承政买了10 个兰博基尼
strvar = "姚承政买了{:>4d}个兰博基尼"
res = strvar.format(10)
print(res)
# 姚承政买了  10个兰博基尼
strvar = "姚承政买了{:^4d}个兰博基尼"
res = strvar.format(10)
print(res)
# 姚承政买了 10 个兰博基尼
 

猜你喜欢

转载自www.cnblogs.com/longerandergou/p/10960082.html