自学python_10 函数01

函数的作用: 将重复的代码,封装到函数,只要使用直接找函数。函数可以增强代码的模块化和提高代码重复利用率。

定义函数:
格式:
def 函数名([参数]):
函数体

注意:
1.必须使用关键字def。
2.函数体注意缩进。
3.函数名和括号紧跟着。

import random


# 生成随机数。
def generate_random():
    for i in range(3):
        ran = random.randint(1,20)
        print(ran)
generate_random()
# 17
# 15
# 17
generate_random()

个人认为:“简单地说,函数就是在内存中开辟一片地址,把代码放在里面。调用的时候就去那片地址寻找执行的语句。


带参数的函数:

参数可以由外部传递,在函数内部进行使用,也可以设置默认的初值。
def(参数,参数 …):
函数体

import random


# 生成随机数。
def generate_random(number):
    for i in range(number):
        ran = random.randint(1, 20)
        print(ran)


generate_random(4)
# 12
# 11
# 20
# 11
generate_random(2)
# 12
# 2


可变参数的函数:

定义方式:

转换成元组的可变参数。

def add(*args):
    print(args)

add()
# ()
add(1)
# (1,)
add(1,2)
# (1, 2)

用 * 加名称的形式定义形参,可以把参数放在一个列表里。
“ * ” 的操作相当于装包,把传进来的参数装成一个元组。

注意: 可变参数必须放在后面。


字典类型的可变参数:

# 字典时用两个 * 
def add(**kwargs):
    print(kwargs)

add(a = 1,b = 2,c = 3)
# {'a': 1, 'b': 2, 'c': 3}

两个 * 代表字典,且传递的参数必须为 key = value 形式,在程序执行的时候,会把key:value转换为字典里的元素。
那么如果把字典作为参数的话会发生什么?会不会转换并赋值给kwargs?下面我们来试验一下。

def add(**kwargs):
    print(kwargs)

d1 = {"1111":1,"2222":2}
add(d1)
# 放进去之后会报错。
# 但是把add(d1)改为add(**d1)
# 就会输出{'1111': 1, '2222': 2}

其实在底层就是将字典拆包成关键字参数的形式,然后底层默认准备一个字典,把拆完的元素放进字典里。但是应该注意的是只有dict类型可以在前面加 **。



为了说明可变参数的关系我们分析一下这段代码。

def bb(a,b,*c,**d):
    print(a,b,c,d)

bb(1,2)
# 1,2赋值给a,b因为c,d是可要可不要的所以并不会报错,c为空元组,d为空字典。
# 1 2 () {}
bb(1,2,3,4)
# 1,2赋值给a,b,3和4作为元组赋值给c,因为d不是一个必要的所以d为空字典。
# 1 2 (3, 4) {}
bb(1,2,x = 100,y = 200)
# 同上面,c为空,d不为空。
# 1 2 () {'x': 100, 'y': 200}
bb(1,2,3,x = 100)
# 这时的c,d,都不为空。
# 1 2 (3,) {'x': 100}
bb(1,2,x = 100,5,6)
# 这是出了问题,因为x = 100 不能转换成元组中的元素,所以在把x = 100带入
# 的时候c元组已经为空,而后面的5,6是不能放进字典中的,所以会报错。
# SyntaxError: positional argument follows keyword argument
# 位置参数跟在关键字参数后面

关键字参数:

def add(a,b = 10):
    result = a + b
    print(result)

add(5)
add(4,7)
# 15
# 11

在传参的时候可以设定默认值,此时的b是默认值,如果传值的话就会覆盖当前的默认值。传参数赋值的顺序是依次赋值, 但如果给定赋值的参数,比如:
def add(a,b = 10,c = 6):
    result = a + b + c
    print(result)

add(5)
add(4,c = 7)
# 21
# 21

这里调用函数的时候给c赋了值,所以没有按照顺序依次赋值。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值