今日内容
目录
一、函数形参与实参
二、实参的分类
三、形参的分类
四、可变参数的整体使用
一、函数实参与行参的定义
'''
1.1实参:
实参:调用函数阶段,在括号内传入的实际值,值可以为常量、变量、表达式或三者的组合
*****
1.2形参
形参:定义函数阶段,在括号内声明的变量名,用来接受外界传来的值
形参与实参的关系:形参随着函数的调用而产生,随着调用结束而销毁
'''
# ***** 在函数定义()中出现的参数:形参 # ***** 形参就是拷贝实参的值,随着函数的调用才产生,随着函数调用结束而销毁 def fn(a, b, c): # a,b,c必须要从外界获取值,才有意义 print(a) print(b) print(c) # 外部提前产生了的变量,内部可以使用 print(x) print(y) print(z) # x,y,z是实际存在的值 x = 10 y = 20 z = 30 # ***** 在函数调用()中出现的参数(外界实际存在的值):实参 # fn(10, 20, 30) # fn(x, y, z) fn(x + 10, y * 2, z / 5) # ***** 调用函数是,实参可以由 常量、变量、表达式或三种的组合
二、实参分类:
2.1实参分类:
'''
1.位置实参:不用明确形参名的传参方式,一定按照位置给形参传值,一一对应给形参传值
2.关键字实参:必须明确形参名字与值为形参传值,可以不用按照位置,指名道姓
*****
注:混用(位置参数必须在关键字参数前面)
1.关键字实参必须出现在位置实参后
2.多个位置实参还是按照位置传参
3.关键字实参为没有从位置实参拿到值的形参传值,可以不用按照指定顺序
'''
def fn2(a, b, c, d, e, f):
print(a, b, c, d, e, f)
fn2(10, 20, 30, e=100, f=500, d=200)
# 位置实参: 按照位置的顺序,从左到右为形参传递值 # 关键字实参 # 实参作用:为形参传递值 def fn1( a, b, c): print(a, b, c) # 位置实参:必须按照顺序一一传给形参 fn1(10, 20, 30) fn1(30, 20, 10) # 关键字实参:可以不按顺序传递, 形参按名字取值 fn1(a=10, b=20, c=30) fn1(c=30, b=20, a=10) # 两者混用: 关键字实参必须出现在位置实参之后 # fn1(10, c=20, a=30) # 10按位置传参给a,a=30给a传参,c可以拿到20,但b没人传参 # TypeError:fn1() got multiple values for argument 'a' a被多次传值 # 合法传参 ***** fn1(10, c=30, b=20) fn1(10, b=30, c=20) def fn2(a, b, c, d, e, f): print(a, b, c, d, e, f) fn2(10, 20, 30, e=100, f=500, d=200)
三、形参的分类
1.形参分类:
1.1位置形参
# positional argument
def fn(a, b, c):
print(a, b, c)
# 位置形参可以由 位置实参 与 关键字实参 来传值
fn(10, 20, 30)
fn(a=10, b=20, c=30)
2.2默认形参
def fn(a=10,b=20):
print(a, b)
# 默认形参可以由 位置实参 与 关键字实参 来传值,还可以不用传值(采用自身默认值)
fn()
fn(20, 30)
fn(a=200, b=300)
fn(100) # 就给a传
fn(b=100) # 就给b传
# 混用
# 位置形参与默认形参同时存在,默认形参必须在后
def fn1(a,b,c=10,d=20):
print(a, b, c, d)
# 位置形参必须传值,默认形参分情况传值
fn1(100, 200, d=1000)
3.3可变长形参
# 可变长形参会以 元组 形式接受 位置形参与默认形参未接受完的 所有传入的位置实参,用索引来取第几个
# 可变长形参只能由 位置实参 来传值 *****
def fn(a, b=10, *args):
print(a, b)
print(args)
# 小细节:可变长形参只能接受位置实参的值,位置实参还必须在关键字实参前,
# 导致默认形参只能由位置实参来传值
fn(1, 20, 100, 200) # 1给a 20给b,不能用b=20传 100,200给args
2..命名关键字形参(在*与**之间的参数,都是要用关键字实参进行传值)作为了解知识点
# 命名关键字参数:在函数定义阶段 写在*与**可变长参数之间的形参
# 在给命名关键字参数传值的时候 只能用关键字为其传值
# 在定义阶段 给你感觉好像是z是默认值参数 放在了m这个位置参数的前面了 应该报错
# 其实z和m都是命名关键字参数 不是默认值参数和位置参数
def func(x,y=1,*args,z=2,m,**kwargs):
print(x,y)
print(args)
print(z,m)
print(kwargs)
func(1, 2, 3, 4, 5, 6, 7,z=8,m=9,k=666,p=999
1 2
(3, 4, 5, 6, 7)
8 9
{'k': 666, 'p': 999}
总结:形参顺序 位置参数> 默认参数 > 可变长参数
四、可参数的整体使用
# 1、可变位置形参以元组方式接收值
# 如:接收10,20,30三个数
def fn1(*args):
print(args) # (10, 20, 30)
# 第一种传参
fn1(10, 20, 30)
# 第二种传参
t = (10, 20, 30) # 单列集合及字符串类型都可以
fn1(*t)
# 2、可变位置实参以字典方式接收值
def fn2(**kwargs):
print(kwargs) # {'name': 'Owen', 'age': 18}
# 第一种传参
fn2(name='Owen', age=18)
# 第二种传参
d = {'name': 'Owen', 'age': 18} # 单列集合及字符串类型都可以
fn2(**d)
四。作业
1、写函数,,用户传入修改的文件名,与要修改的内容,执行函数,完成批量修改操作
2、写函数,计算传入字符串中【数字】、【字母】、【空格] 以及 【其他】的个数
3、写函数,判断用户传入的对象(字符串、列表、元组)长度是否大于5。
4、写函数,检查传入列表的长度,如果大于2,那么仅保留前两个长度的内容,并将新内容返回给调用者。
5、写函数,检查获取传入列表或元组对象的所有奇数位索引对应的元素,并将其作为新列表返回给调用者。
6、写函数,检查字典的每一个value的长度,如果大于2,那么仅保留前两个长度的内容,并将新内容返回给调用者。
dic = {"k1": "v1v1", "k2": [11,22,33,44]}
PS:字典中的value只能是字符串或列表
复制代码
#题目一
def modify_file(filename,old,new):
import os
with open(filename,'r',encoding='utf-8') as read_f,\
open('.bak.swap','w',encoding='utf-8') as write_f:
for line in read_f:
if old in line:
line=line.replace(old,new)
write_f.write(line)
os.remove(filename)
os.rename('.bak.swap',filename)
modify_file('/Users/jieli/PycharmProjects/爬虫/a.txt','alex','SB')
#题目二
def check_str(msg):
res={
'num':0,
'string':0,
'space':0,
'other':0,
}
for s in msg:
if s.isdigit():
res['num']+=1
elif s.isalpha():
res['string']+=1
elif s.isspace():
res['space']+=1
else:
res['other']+=1
return res
res=check_str('hello name:aSB passowrd:alex3714')
print(res)
#题目三:略
#题目四
def func1(seq):
if len(seq) > 2:
seq=seq[0:2]
return seq
print(func1([1,2,3,4]))
#题目五
def func2(seq):
return seq[::2]
print(func2([1,2,3,4,5,6,7]))
#题目六
def func3(dic):
d={}
for k,v in dic.items():
if len(v) > 2:
d[k]=v[0:2]
return d
print(func3({'k1':'abcdef','k2':[1,2,3,4],'k3':('a','b','c')}))
复制代码