深度解读python的函数

文章目录

函数

概念:功能 (包裹一部分代码 实现某一个功能 达成某一个目的)
特点:可以反复调用,提高代码的复用性,提高开发效率,便于维护管理

#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

运行
运行

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值