python语法(函数的定义使用、参数、lambda表达式、生成器函数)

目录

函数

传递参数时的序列解包

 变量的作用域

递归函数

lambda表达式

生成器对象


函数

概述:函数就是执行特定任务以完成特定功能的一段代码

函数的好处:

  1. 复用代码
  2. 隐藏实现细节
  3. 提高可维护性
  4. 提高可读性便于调式

函数的创建

  1. 不需要说明形参类型,python解释器会根据实参的值自动推断形参类型
  2. 不需要指定函数返回值类型,这由函数中return语句返回的值来确定
  3. 即使函数不需要接受任何参数,也必须保留一对空迭代圆括号
  4. 函数头部括号后面的冒号不可少
  5. 函数体相对于def关键字必须保持一定的空格缩进
# @Author:韩慧腾
# @Time :2022/7/8 10:10
# @File :函数_Demo0.py
# 努力已经来不及了,你得拼命
#函数的定义
def sum(a,b):
    sum=a+b
    return sum;
c=sum(12,23)#函数的调用 通过位置传参数
c1=sum(b=12,a=23)#通过变量名字传参数
print(c)#35

函数的参数

  • 形式参数(简称形参):位置在函数定义处
  • 实际参数(简称实参):位置是在函数调用处
  • 函数定义默认值参数:函数定义时,给形参设置默认值,只有与默认值不符的时候才需要传递实参
  • 关键参数:主要指调用函数时的参数传递方式,通过关键参数可以按参数名字传递值,明确指定哪个值传递给哪个参数,实参顺序可以和形参顺序不一致,但不影响参数值的传递结果。

注意:在定义带有默认值参数的函数时,任何一个默认值参数右边都不能再出现没有默认值的普通位置参数,否则会提示语法错误

我们一直用的print函数输出都会换行就是因为print函数定义的时候有个默认参数(end='\n'),只要我们使用的时候改变这个默认值就可以达到不换行的效果。 

# @Author:韩慧腾
# @Time :2022/7/9 10:13
# @File :函数_Demo2.py
# 努力已经来不及了,你得拼命
print('hello')
print('wprld')
print('hello',end='\t')
print('world')

 

  •  函数的参数定义

1.个数可变的位置参数

定义函数时,可能无法事先确定传递的位置参数的个数时,可以使用可变的位置参数,使用*定义个数可变的位置形参,结果为一个元组

2. 个数可变的关键字形参

定义参数时,无法事先确定传递的关键字实参的个数时,使用可变的关键字形参,使用**定义个数可变的关键字形参,结果为一个字典

# @Author:韩慧腾
# @Time :2022/7/9 10:47
# @File :函数_Demo3.py
# 努力已经来不及了,你得拼命
def fun(*a):
    print(a)
#函数的调用
fun(12)
fun(12,23)
fun(12,23,123)
# @Author:韩慧腾
# @Time :2022/7/9 13:26
# @File :函数_Demo4.py
# 努力已经来不及了,你得拼命
def fun(**a):
    print(a)
#函数的调用
fun(a=10)#{'a': 10}
fun(a=11,b=22,c=33)#{'a': 11, 'b': 22, 'c': 33}

注意:

  1. 个数可变的位置参数和关键字参数只能是一个
  2. 在一个函数的定义过程中,既有个数可变的关键字形参,也有个数可变的位置参数,要求个数可变的位置形参放在个数可变的关键字之前
  3. 如果有多个参数,其中有*,则*后面的就是关键字参数

传递参数时的序列解包

概述:与可变长度的参数相对应,这里的序列解包是指实参,同样也有*和**两种形式。调用含有多个位置参数的函数时,可以使用python列表、元组、集合、字典以及其他可迭代对象作为实参,并在实参名称前面加一个*,python解释器将自动进行解包,然后把序列中的值分别传递给多个形参变量

def demo(a,b,c):
    print(a+b+c)
l=[1,2,3]
demo(*l) #6 对列表进行解包
d={1:2,3:4,4:5}
demo(*d) # 8 对字典进行解包
demo(*d.values()) #11

如果实参是个字典,可以使用**对其进行解包。会把字典转换成类似于关键参数的形式进行参数传递。对于这种形式的序列解包,要求实参字典中的所有键都必须是函数的形参名称,或者与函数中两个星号的可变长度参数相对应。

def demo(a,b,c):
    print(a+b+c)
d={'a':2,'b':4,'c':5}
demo(**d) # 11 对字典进行解包

 变量的作用域

作用域就是程序代码能访问该变量的区域,根据变量的有效范围可分为局部变量和全员变量。

如果想要在函数内部修改一个定义在函数外的变量值,必须要使用global明确声明,否则会自动创建新的局部变量。

如果局部变量与全局变量具有相同的名字,那么该局部变量会在自己的作用域内暂时隐藏同名的全局变量。

递归函数

 概述:如果在一个函数的函数体内调用了该函数的本身,这个函数就称为递归函数

递归的组成部分:递归调用和递归终止条件

递归的调用过程:每递归调用一次函数,都会在栈内存分配一个栈帧,每执行完一次函数,都会释放相应的空间

递归的优缺点:优点是思路和代码简单,缺点是占用内存多效率低下。

# @Author:韩慧腾
# @Time :2022/7/9 14:27
# @File :函数_Demo5.py
# 努力已经来不及了,你得拼命
#递归函数
def fac(n):
    if n==1:
        return 1
    else:
        return n*fac(n-1)
#函数的调用
print(fac(6))

斐波那契数列

# @Author:韩慧腾
# @Time :2022/7/9 14:37
# @File :函数_Demo6.py
# 努力已经来不及了,你得拼命
def f(n):
    if n==1 or n==2:
        return 1
    else:
        return f(n-1)+f(n-2)
print(f(6))#斐波那契数列的第六位数

lambda表达式

lambda表达式常用来声明匿名函数,也就是没有函数名字的、临时使用的小函数。常用在临时需要一个类似于函数的功能但又不想定义函数的场合;lambda表达式只可以包含一个表达式,不允许包含复杂语句结构,但在表达式中可以调用其他函数,该表达式的计算结果相当于函数的返回值。

生成器对象

包含yield语句的函数可以用来创建生成器对象,这样的函数也称生成器函数.yield语句与return语句的作用相似,都是用来从函数中返回值;与return语句不同的是,return 语句一旦执行会立刻结束后函数的运行,而每次执行到yield语句并返回一个值之后会有暂停或挂起后面代码的执行,下次通过生成器对象的__next__()方法、内置函数next()、for循环遍历生成器对象元素或其他方式显示“索要”数据时恢复执行。生成器具有惰性求值的特点,适合大数据处理。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

凌晨四点半sec

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值