Python学习第八课-函数

一、函数简介

1.1 简介

  • 函数是一个对象

  • 特点

    • 函数中可以保存一些可执行的代码,可以重复调用
    • 函数中的代码不会立即执行,需要调用的时候代码才会执行
  • 函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段。

1.2 规则

  • 函数代码块以 def 关键词开头,后接函数标识符名称和圆括号 ()。
  • 任何传入参数和自变量必须放在圆括号中间,圆括号之间可以用于定义参数。
  • 函数的第一行语句可以选择性地使用文档字符串—用于存放函数说明。
  • 函数内容以冒号 : 起始,并且缩进。
  • return [表达式] 结束函数,选择性地返回一个值给调用方,不带表达式的 return 相当于返回 None。
    在这里插入图片描述

1.3 语法

语法
Python 定义函数使用 def 关键字,一般格式如下:

def 函数名(参数列表):
    函数体

1.4 函数的创建与调用

def fun():#fun是函数名,又可以称呼为函数对象
    print('这是我的第一个函数')

fun() #函数调用

二、函数的参数

2.1 形参

  • 形参(形式参数) 定义形参就相当于在函数内部声明了变量,但是并不是赋值

2.2 实参

  • 实参(实际参数)指定了形参,那么在调⽤函数时必须传递实参,实参将会赋值给对应的形参,简单来说有⼏个形参就要有⼏个实参

2.3 案列解析

def fun(a,b):#函数的参数相当于在函数内部定义了,这两个变量,并没有实质性的意义,因为没有赋值,a,b就是一个形参(形式上的参数)
    print(a+b)
fun(1,2) #1,2 则是实际上的参数 
# 调用函数 ,如果有形参,那么必须传递实参(实际的参数),需要与形参对应
'''
3
'''

2.4 实参的类型

  • 整数
def fun(a):
    print(a)

b=123#整数
fun(b) 
'''
123
'''
  • 列表
def fun(a):
    print(a)
b=[1,2,3]#列表
fun(b) 
'''
[1, 2, 3]
'''
  • 布尔型
def fun(a):
    print(a)
b=None#布尔型
fun(b) 
'''
None
'''
  • 字符串
def fun(a):
    print(a)
b='abcd'#字符串
fun(b)
'''
abcd
'''
  • 元组
def fun(a):
    print(a)
b=('a','b','c','d')#元组
fun(b)
'''
('a', 'b', 'c', 'd')
'''
  • 字典
def fun(a):
    print(a)
b= {'a':1,'b':2,'c':3,'d':4}#字典
fun(b)
'''
{'a': 1, 'b': 2, 'c': 3, 'd': 4}
'''

三、参数的传递方式

3.1 位置传参

  • 位置传参就是将对应位置的实参赋值给对应位置的形参
def fun(a,b,c,d):
    print(a)
    print(b)
    print(c)
    print(d)

fun(1,2,3,4)
'''
fun(1,2,3,4)
'''

3.2 关键字传参

  • 关键字传参:关键字传参可以不按照形参定义的顺序去传递,⽽根据参数名进⾏传递
def fun(a,b,c,d):
    print(a)
    print(b)
    print(c)
    print(d)

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

3.3 默认值传参

  • 默认值传参:在设置形参时,可以直接设置默认值,当该位置设置实参时,引用实参,没有设置直接引用默认值
def fun(a,b,c=20,d=0):
    print(a)
    print(b)
    print(c)
    print(d)

fun(1,2,3)
'''
1
2
3
0
'''
def fun(a,b,c=20,d=0):
    print(a)
    print(b)
    print(c)
    print(d)

fun(1,2,d=3)
'''
1
2
20
3
'''

3.4 混合传参

  • 混合传参:将位置传参和关键字传参混合使用时需要注意,位置传参需要设置在关键字传参之前
def fun(a,b,c=20,d=0):
    print(a)
    print(b)
    print(c)
    print(d)

fun(1,2,b=3)
'''
TypeError: fun() got multiple values for argument 'b'
#b获得了多个传参
'''
def fun(a,c=20,d=0,b):
    print(a)
    print(b)
    print(c)
    print(d)

fun(1,2,b=3)
'''
SyntaxError: non-default argument follows default argument
# 将没有默认值的b放在了有默认值的形参后面
'''
def fun(a,b,c=20,d=0):
    print(a)
    print(b)
    print(c)
    print(d)

fun(1,2,d=3)
'''
1
2
20
3
'''

四、不定长参数

  • 不知道会接受几个参数,所以用不定长参数(形参)来接受实参

4.1 传参顺序

4.2 *args不定长参数

  • 不定长参数,在定义函数是用 *args 来接受,其中 * 是规定的,args可用其他名称替换,但一般习惯用 args 来表示。参数在传入函数后,被封装成一个 tuple 来进行使用。所以我们在函数内部,可以通过操作 tuple 的方法来操作参数
def fun(*args):
    print(*args)
    print(args) #不定长参数的数据类型是元组
    r=0
    for i in args:
        r+=i
    print(r)
fun(1,2,3,4,5)
'''
1 2 3 4 5
(1, 2, 3, 4, 5)
15
'''
def fun(a, b, *args):
    print(a)
    print(b)
    print(args)
    print(args[1])#元组访问规则
    ret = a + b
    for i in args:
        ret += i
    print(ret)

fun(1,2,3,4) #1,2分别赋值给a,b,剩下的参数以元组的形式赋值给args
'''
1
2
(3, 4)
4
10
'''
def fun(b,*args,c):
    print(*args)
    print(args)
    r=0
    for i in a:
        r+=i
    print(r)
fun(1,2,3,4,5)
'''
TypeError: fun() missing 1 required keyword-only argument: 'c'
#当*a和位置传参混使用的时候,位置参数一定要放到*a前面
'''
def fun(b,*args,c):
    print(*args)
    print(*args)
    r=0
    for i in a:
        r+=i
    print(r)
fun(1,2,3,4,b=2)
'''
TypeError: fun() got multiple values for argument 'b'
#当*a和关键字传参一起使用时,关键字传参要放到最后面
'''
def fun(c,*args,b):
    print(*args)
    print(args)
    r=0
    for i in a:
        r+=i
    print(r)
fun(1,2,3,4,b=2)
'''
2 3 4
(2, 3, 4)
9
#传参顺序是 位置传参,不定长参数,关键字传参
'''
def print_numbers(*args):
    print(args,type(args))  # tuple
    for n in args:
      print(n,type(n))   # int

l = [1, 2, 3, 4]
print_numbers(*l)  # *l,等价于 print_numbers(1, 2, 3, 4)
print_numbers(l)   # 将 l 作为一个整体传入,这样函数接受到的其实只有一个参数,且参数类型为 list
'''
(1, 2, 3, 4) <class 'tuple'>
1 <class 'int'>
2 <class 'int'>
3 <class 'int'>
4 <class 'int'>
([1, 2, 3, 4],) <class 'tuple'>
[1, 2, 3, 4] <class 'list'>
'''

4.3 **kwargs不定长传参

**kwargs,加了两个星号 ** 的参数会以字典的形式导入,因为返回的是字典,所以传入时需要指定参数名

def fun(a, b, **kwargs):
    print(a)
    print(b)
    print(*kwargs)
    print(kwargs)
    print(kwargs['c'],kwargs['d'])

fun(1, 2, c=3, d=4)
'''
1
2
c d
{'c': 3, 'd': 4}
3 4
'''

五、参数的拆包

def fun(a,b,c):
    print(a, b, c)
x = (1,2,3) # 元组数据
y = [4,5,6] # 列表数据
z = {'a':7, 'b':8, 'c':9} # 字典数据
fun(*x)  # 元组解包  *
fun(*y)  # 列表解包  *
fun(**z) # 字典解包  通过 **对字典进行解包
'''
1 2 3
4 5 6
7 8 9
'''
def test1(a, b, c=0, *args, **kwargs):
    print('a =', a, 'b =', b, 'c =', c, 'args =', args, 'kw =', kwargs)

def test2(a, b, c=0, *args, d, **kwargs):
    print('a =', a, 'b =', b, 'c =', c, 'd =', d, 'args=', args, 'kw =', kwargs)

# 定义一个元组和字典用作参数传入
args = (1, 2, 3, 4)
kw = {'d': 99, 'x': '#'}

test1(*args, **kw)
# a = 1 b = 2 c = 3 args = (4,) kw = {'d': 99, 'x': '#'}
test2(*args, **kw)
#a = 1 b = 2 c = 3 d = 99 args= (4,) kw = {'x': '#'}

六、作业

6.1 名片打印

1.打印名片程序:输入姓名,电话号码,性别,最后打印出来名片

  • 控制姓名长度为6-20
  • 电话号码长度11
  • 性别只能允许输入男或女
  • 每一样信息不允许为空
#@author:mianhua
#@Time:2021/4/27
#@File:作业.py
#@Describition:
print('欢迎使用财源广进名片打印系统')
def user_check():
    global user_name
    user_name=input('请输入姓名:')
    if 6<=len(user_name)<=20:
        phone_check()
    else:
        print('用户名长度限制6-20,请重新输入')
        user_check()
def phone_check():
    global user_phone
    user_phone=input('请输入您的手机号:')
    if len(user_phone)!=11 :
        print('手机号码为11位,请重新输入')
        phone_check()
    elif not user_phone.isdigit():
        print('手机号码必须为纯数字,请重新输入')
        phone_check()
    else:
        sex_check()

def sex_check():
    global user_sex
    user_sex = input('请输入您的性别:')
    if user_sex not in ['男','女']:
        print('请输入正确的性别,男或者女')
        sex_check()
    else:
        print('恭喜您,信息输入成功!\n您的姓名是:{},性别:{},手机号码:{}'.format(user_name,user_sex,user_phone))
user_check()

'''
欢迎使用财源广进名片打印系统
请输入姓名:棉花糖
用户名长度限制6-20,请重新输入
请输入姓名:
用户名长度限制6-20,请重新输入
请输入姓名:草莓小棉花糖
请输入您的手机号:
手机号码为11位,请重新输入
请输入您的手机号:1234567890
手机号码为11位,请重新输入
请输入您的手机号:1234567890a
手机号码必须为纯数字,请重新输入
请输入您的手机号:13150040170
请输入您的性别:你说什么
请输入正确的性别,男或者女
请输入您的性别:男
恭喜您,信息输入成功!
您的姓名是:草莓小棉花糖,性别:男,手机号码:13150040170
'''

6.2 斐波那契数列

2.使用函数求前20个斐波那契数列斐波那契数列: 1.1,2,3,5,13,2…即0: 起始两项均为1,
此后的项分别为前两项之和

def Fibonacci_sequence(a):
        list1=[0,1]
        for i in range(2,a):
            num=list1[i-2]+list1[i-1]
            list1.append(num)
        print(list1)
        
Fibonacci_sequence(20)
'''
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181]
'''

6.3 求和函数

3.编写- -段代码,定义一个函数求1- 100之间所有整数的和,并调用该函数打印出结果
def get_number(a):
    num = 0
    for i in range(a + 1):
        num += i
    print(num)

get_number(100)
'''
5050
'''
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

MIANHUA_007

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

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

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

打赏作者

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

抵扣说明:

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

余额充值