Python 函数

1、定义

函数是实现某个功能的一段代码
在这里插入图片描述

2、作用

  • 方便维护,模块设计
  • 减少代码冗余的
  • 维护方便

3、参数分类

3.1 按定义分

形参

函数定义的时候,指定的参数

实参

函数调用的时候,传递的参数

参数顺序要求
  • 形参顺序
    func01(必选参数,可变长位置参数,默认参数,可变长关键字参数)
  • 实参顺序
    fun01(位置参数,关键字参数)

3.2 按形参分

a )必选参数

调用的时候一定要传的参数

def studentinfo(name, age, sex):  # 形参 必选参数
    print(f"my name is {name},my age is {age},my sex is {sex}")
b )默认参数

提供默认值,调用时可填可不填

def studentinfo(name, age, sex="f"):  # sex就是默认参数,默认参数放在必选参数后面
    print(f"my name is {name},my age is {age},my sex is {sex}")

studentinfo("sc", 18)
studentinfo("sc", 18, "m")
c )可变长位置参数
>>> t1 = ("a","b","c")
>>> print(*t1)   #解包
a b c
def myargs(name, *num):
    print(f"{name}:{num}")  # 传递进来的参数默认打包成一个元组
    print(type(num), *num)  #解包,传多少个就打印多少个

myargs("hejin")
myargs("hejin", 1)
myargs("hejin", 1, 2)
myargs("hejin", 1, 2, 3)
结果:
hejin:()
<class 'tuple'>
hejin:(1,)
<class 'tuple'> 1
hejin:(1, 2)
<class 'tuple'> 1 2
hejin:(1, 2, 3)
<class 'tuple'> 1 2 3
d )可变长关键字参数
def myargs2(**num):
    print(num)
    print(**num)  # 这种解包出来为a=1,b=2 是不能够打印输出的


myargs2(a=1, b=2)  #
# 打包:**num: 传参a=1,b=2   —packing —    {"a":"1","b":"2"}
# 解包:**num:  {"a":"1","b":"2"} — unpacking — a=1,b=2 

3.2 按实参分

a )位置参数

按参数顺序依次传递

studentinfo("sc", 18, "f")  # 实参 ,位置参数
b )关键字参数

按key依次传递

def studentinfo(name, age, sex="f"):  # sex就是默认参数,默认参数要放在最后(带等号的都放最后)
    print(f"my name is {name},my age is {age},my sex is {sex}")

studentinfo("sc", 18)
studentinfo("sc", 18, "m")
# 关键字参数
def studentinfo(name, age, sex):
    print(f"my name is {name},my age is {age},my sex is {sex}")

studentinfo("hejin", sex="f", age=18)  # 位置参数一定要放在关键字参数前面

练习:

#可变长位置参数 (*args)
#计算N个数的和(N数量不确定)
def myargs3(*num):
    num_sum = 0
    l = len(num)
    for i in num:
        num_sum += i
    print(f"{l}数之和为:", num_sum)


myargs3(1, 3, 4, 5, 5)

#可变长关键字参数(**kwargs)
#计算N个数的和
#N数量不确定
def myargs4(**num):
    num_sum = 0
    l = len(num.keys())
    for i in num:
        num_sum += num.get(i)
    print(f"{l}数之和为:", num_sum)


myargs4(a=1, b=2, c=3, d=4)

3、 return 语句

退出函数,并且返回结果的
return可以有多个
return可以一次返回多个值
如果一个函数没有return语句,默认返回None
return 后面不接任何表达式,也返回None

def maxnum(x, y):
    print("return语句。。。。。")
    if x > y:
        print("return x")
        return x
    elif y > x:
        print("return y")
        return   #执行这个分支,返回None
    return x, y  #返回值可以用俩个变量接收
    print("return end...")


result = maxnum(3, 4)
i, j = maxnum(5, 5)
print(f"结果:{result},i为{i},j为{j}")
print(f"结果:{result}")

4、匿名函数(lamada表达式)

不需要创建函数名
只能有一个表达式,不用写return

add2 = lambda x, y: x + y
print(add2(1, 3))
# 可变长位置参数
add3 = lambda *num: sum(num)
print(add3(1, 2, 3))

# 可变长关键字参数
add4 = lambda **num: num

print(add4(a=1, b=2))

# 使用匿名函数返回俩数之间最大值
max_num = lambda a, b: a if a > b else b  #方式1
max_num = lambda a, b:max(a,b)            #方式2
max_num = lambda a, b: x > y and x or y   #方式3
print(max_num(1, 2))

# 使用匿名函数,将传入的浮点数保留俩位小数
float_num = lambda a: float("%.2f" % a)  #方式1
float_num = lambda a: round(x,2)         #方式2
print(float_num(2.33333))

5、递归函数

自己调用自己,形成循环
定义出口条件,什么时候结束递归
通常把一个大问题通过寻找规律可以缩小规模的时候使用的

5.1 阶乘

def func01(n):
    if n == 1:
        return 1
    return n*func01(n-1)
print(func01(3))

5.2 斐波拉契数列

# 斐波拉契数列
def fblq(n):
    if n == 1 or n == 2:
        return 1
    else:
        return fblq(n - 1) + fblq(n - 2)

a = int(input("请输入数列项数:"))
str1 = ''
for i in range(a):
    str1 += str(fblq(i + 1)) + ','
print(str1)

5.3 雌雄兔繁殖

1、2 月 1只
3、4月 2只
5、6月 4只
7、8月 8只

# 雌雄兔
def rabbit(n):
    if n == 1 or n == 2:
        return 1
    return rabbit(n - 2) * 2
print(rabbit(8))

6、参数传递

函数的参数传递本质上都是传递引用

6.1 不可变数据类型

def fun1(x):
    print(x)  # 打印1
    x = 100  # 局部变量
    print(x)  # 打印100

x = 1  # 全局变量
fun1(x)
print(x)  # 打印1

6.2 可变数据类型

全局变量在函数里面虽然被修改了,但是引用的地址不变
参数定义的时候,默认参数避免定义成一个可变数据类型

def fun2(a):
    print(a)  # 打印[1, 2, 3]
    a[0] = 100  # 局部变量
    print(a)  # 打印[100, 2, 3]
    
a = [1, 2, 3]  # 全局变量
fun2(a)   
print(a)   # 打印[100, 2, 3]
def f(a=[]):  #调用函数的时候第一次是空列表,再调用就不是了
    a.append(1)
    print(a)
f()
f()
f()

结果:
[1]
[1, 1]
[1, 1, 1]

7、变量的作用域

若全局变量是不可变数据类型,在局部修改全局变量有效 要加global

def f():
    # x = 2 如果你要申明全局变量,就不要再前面定义一个同名的局部变量,会报错
    global x   #申明x为全局变量
    x = 5
x = 1
f()
print(x)   #打印5

8、变量名的解析(LEGB)

  • L 在本地变量中 --local
  • E 在任意上层函数的作用域 Enclosing function locals
  • G 在全局作用域 --global
  • B 在内置作用域 --builtin
def f():
    x = 2  #注释掉  x = 1(找G)
    def f2():
        x = 3   #注释掉 x = 2 (找E)
        print(x)  #x = 3  (找L)
        print(__name__)  #__main__
    f2()
x = 1 #注释掉  报错(找B没找到)
__name__ = "sc"  #注释掉 找E 输出__main__
f()

9、注释

文档注释会放在help的描述信息里面
放在函数模块或类里面 第一个用三引号注释的内容

def f():
    """这里是文档注释"""  
    print("hello")
f()
print(help(f))

结果:
hello
Help on function f in module __main__:

f()
    这里是文档注释

None

10、内建函数与工厂函数

内建:Python已经建好了,我们直接调用
内建函数

在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

这个手刹不太灵儿

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

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

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

打赏作者

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

抵扣说明:

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

余额充值