文章目录
函数
概念:功能 (包裹一部分代码 实现某一个功能 达成某一个目的)
特点:可以反复调用,提高代码的复用性,提高开发效率,便于维护管理
#Python函数的基础知识
函数是一段具有特殊功能的、可重用的语句组。(将代码封装起来)
定义:def(定义一个函数)关键词开头,空格之后接函数名称和圆括号(),最后还有一个“:”。
def是固定的,不能变,必须是连续的def三个字母,不能分开。
空格 为了将def关键字和函数名称分开,必须空。
函数名:函数名只能包含字符串、下划线和数字且不能以数字开头。
虽然函数名可以随便起,但我们给函数起名字还是要尽量简短,并表达函数功能。
括号:必须要有;
注释:每一个函数都应该对功能和参数进行相应的说明,应该写在函数下面第一行。以增强代码的可读性。
调用:就是函数名() 一定要加上括号。
1.函数基本格式
#定义一个函数
def 函数名():
code1
code
#调用函数
函数名()
#定义函数
def func():
print("我是一个函数 … ")
#调用函数
func()
#函数定义
def my_len():
"""计算s1的长度"""
s1 = "hello world"
length = 0
for i in s1:
length = length+1
print(length)
#函数调用
my_len()
函数的定义和调用
注:只定义函数而不调用,函数就不执行。
2.函数的命名
字母数字下划线,首字符不能为数字
严格区分大小写,且不能使用关键字
函数命名有意义,且不能使用中文哦
驼峰命名法:
(1) 大驼峰命名法: 每个单词的首字符要大写 (类的命名)
mycar => MyCar
(2) 小驼峰命名法: 除了第一个单词首字符小写外,剩下单词首字符大写 (函数或者变量)
mycar => myCar
_命名法:可以将不同的单词用_拼接在一起
mycar => my_car
symmetric_difference symmetricDifference SymmetricDifference
#函数定义
def cfb_99(): for i in range(1,10): for j in range(1,i+1): print("{:d}*{:d}={:2d} ".format(i,j,i*j) ,end="") print()
运行运行
#调用函数,打印多次,可以循环调用
for i in range(5):
cfb_99()
函数写出乘法口诀
3.函数的参数
参数: 函数运算时需要的值
参数种类:
(1)形参: 形式参数,在函数的定义处
(2)实参: 实际参数,在函数的调用处
形参的种类:
1.普通形参(位置形参) 2.默认形参 3普通收集形参 4.命名关键字形参 5.关键字收集形参
实参的种类:
1.普通实参(位置实参) 2.关键字实参
原则:
形参和实参要一一的对应
1.普通形参(位置形参)
#定义函数
"""hang,lie普通形参,在函数定义处""" def small_star(hang,lie): i = 0 while i < hang: j = 0 while j < lie: print("*",end="") j +=1 print() i += 1
运行运行
#调用函数
“”“10,10普通实参,在函数的调用处”“”
small_star(10,10)
small_star(2,3)
2.默认形参
“”“hang,lie默认形参,在函数定义处”“”
“”"
如果给予实参,那么使用实参
如果没有给予实参,那么使用参数身上的默认值
“”"
def small_star(hang=10,lie=10):
i = 0
while i < hang:
j = 0
while j < lie:
print("*",end="")
j +=1
print()
i += 1
small_star(4,8)
small_star(8)
small_star()
默认形参,调用时带有实参时,就按实参运行,不带实参就按默认的形参值运行
传一个实参,给第一个形参赋值
3.普通形参 + 默认形参
“”“定义参数时,普通(位置)形参必须写在 默认形参 的前面 不能调换位置”“”
def small_star(hang,lie=10): i = 0 while i < hang: j = 0 while j < lie: print("*",end="") j +=1 print() i += 1 small_star(5,7) # small_star(5) # small_star() error
运行运行
普通形参必须传值,否则报错
4.关键字实参
print(“<=============>”)
“”"
1.如果都是关键字实参,可以任意调整实参的顺序
2.普通实参必须写在关键字实参的前面
"""
def small_star(hang,a,b,c,lie=10):
i = 0
while i < hang:
j = 0
while j < lie:
print("*",end="")
j +=1
print()
i += 1
# hang a … lie 具体指定参数的值 叫做关键字实参, 在函数的调用处赋值;
# small_star(hang=3,a=4,b=5,c=6,lie=7)
# small_star(b=5,c=6,lie=7,a=4,hang=3) #全部使用关键字实参,可以任意调整实参顺序
small_star(3,4,b=5,c=6,lie=7) #普通实参与关键字实参同时存在,普通实参必须在关键字实参前面
small_star(3,4,b=5,lie=7,c=6)
# small_star(b=5,c=6,lie=7,3,4) error
普通实参如果跟在关键字实参后面,将报错
5.收集参数
(1) 普通收集形参: 专门用来收集那些多余的没人要的普通实参
收集之后,会把多余实参打包成一个元组
定义的时候,参数头上1个星星。调用的时候不用加星星
如果没有定义收集普通形参,那么实参个数一定得与形参数量一致,既不能多,也不能少,不然报错。
定义了收集普通形参,实参个数就没有限制了。但普通收集普通形参,只能收集位置参数,不能收集关键字参数
def func(*args): args不是固定的,可以任意起名
pass
args => arguments
"""
def func(a,b,c,*args): #定义的时候加*
print(a,b,c) # 1 2 3
print(args) # (4,5,6) #调用的时候不加*
func(1,2,3,4,5,6)
打印args,是一个元祖
#计算任意个数值得累加和 def mysum(*args): total = 0 for i in args: total += i print(total) mysum(1,2,3,4,4,45,10,100)
运行运行
收集普通实参,获得的是个元祖,可以针对元祖做相关运算
(2) 关键字收集形参: 专门用来收集那些多余的没人要的关键字实参
收集之后,会把多余关键字实参打包成一个字典
参数头上有2个星星
收集关键字形参,只能收集关键字实参,不能收集位置实参
def func(**kwargs): kwargs也是自己定义的
pass
kwargs => keyword arguments
def func(a,b,c,**kwargs):
print(a,b,c)
print(kwargs) # {‘f’: 100, ‘e’: 200, ‘z’: 12}
func(c=1,a=3,b=10,f=100,e=200,z=12)
收集关键字形参,只能收集关键字实参
#拼接任意个数值变成字符串 """ 班长: 赵万里 班花: 马春陪 划水群众: 赵沈阳,李虎凌,刘子涛 """ def func(**kwargs): strvar1 = "" strvar2 = "" # 定义职位信息 dic = {"monitor":"班长","classflower":"班花"} print(kwargs) # 共5次循环 for k,v in kwargs.items(): if k in dic: # 将2次循环的结果通过+= 拼接在一起 strvar1 += dic[k] + ":" + v + "\n" else: # 将3次循环的结果通过+= 拼接在一起 strvar2 += v + " , " print(strvar1.strip()) print("划水群众:",strvar2.strip(" , "))
<span class="token triple-quoted-string string">""" # print(k,v) k v monitor 赵万里 classflower 马春陪 water1 赵沈阳 water2 李虎凌 water3 刘子涛 {'monitor': '赵万里', 'classflower': '马春陪', 'water1': '赵沈阳', 'water2': '李虎凌', 'water3': '刘子涛'} """</span>
func(monitor=“赵万里”,classflower=“马春陪”,water1=“赵沈阳”,water2=“李虎凌”,water3=“刘子涛”)
6.命名关键字参数
"""
(1) def func(a,b,*,c,d) 跟在*号后面的c和d是命名关键字参数
(2) def func(*args,e,**kwargs) 加在*args和**kwargs之间的参数都是命名关键字参数 必须是收集普通形参在前,收集关键字形参在后,命名关键字参数在中间,顺序不能变动
命名关键字参数 : 在调用函数时,必须使用关键字实参的形式来进行调用;
“”"
# 定义方法一
def func(a,b,*,c,d):
print(a,b)
print(c,d)
# 必须指定关键字实参,才能对命名关键字形参进行赋值
func(1,2,c=3,d=4)
不传命名关键字实参也会报错
传命名关键字实参才能正常执行
#定义方法二 def func(*args,e,**kwargs): print(args) # (1, 2, 3, 4) print(e) # 3 print(kwargs) # {'a': 1, 'b': 2} func(1,2,3,4,a=1,b=2,e=3)
运行运行
这种格式必须固定,顺序不能改变,以下定义方式是不对的
不传命名关键字参数会报错
以下才是正常的定义以及调用
1.星号的使用
"""
* 和 ** 如果在函数的定义处使用:
* 把多余的普通实参打包成元组
** 把多余的关键字实参打包成字典
- 和 ** 如果在函数的调用处使用:
- 把元组或者列表,集合(集合顺序不定),字符串 等容器进行解包
** 把字典进行解包
“”"
- 把元组或者列表,集合(集合顺序不定),字符串 等容器进行解包
def func(a,b,*,c,d):
print(a,b)
print(c,d)
tup = (1,2)
# 函数的调用处 号用法
func(tup,c=3,d=4) # func(1,2,c=3,d=4)
在调用出放在变量的前面,相当于把该变量解包成对应的实参调用到函数中,如下,将lst中的两个值解包成两个位置实参赋值给a,b
只能解包赋值给普通(位置实参),不能解包赋值给关键字实参
*解包只能赋值给普通实参,不能解包赋值给关键字实参
2.函数的调用处 **号用法
dic={"c":3,"d":4}
func(1,2,**dic) # func(1,2,c=3,d=4)
**用法中,给出的字典中的键必须和函数中命名关键字参数一致,否则报错
如下,可以使用**在函数调用处使用,**调用出使用只能赋值给关键字实参,不能赋值给位置实参
#综合写法
# 函数的调用处
tup = (1,2)
dic={"c":3,"d":4}
func(*tup,**dic)
#定义成如下形式,可以收集所有的实参,因为实参只有两种,位置实参和关键字实参
def func(*args,**kwargs): pass
运行运行
#总结: 当所有的形参都放在一起的时候,定义形参存放顺序原则:
“”"
普通形参 -> 默认形参 -> 普通收集形参 -> 命名关键字形参 -> 关键字收集形参
“”"
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(1,2,3,4,d=99,x=#)
f1(*args, **kw) # a=1 b=2 c=3 args=(4,) kw={d:99,x:#}
#(三)
myargs = (1, 2, 3)
mykw = {'d': 88, 'x': '#'}
#f2(1,2,3,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