Python--函数

Python–函数

作用

函数就是将一段具有独立功能的代码块整合到一个整体并命名,在需要的位置调用这个名称即可完成对应的需求

函数在开发过程中,可以更高效的实现代码重用

函数的使用步骤

定义函数

def 函数名(参数):
	代码1
	代码2
	......

调用函数

函数名(参数)

注意:

​ 1.不同的需求,参数可有可无

​ 2.在Python中,函数必须先定义后使用

函数实例

需求:复现ATM机取款功能

# 1.定义函数
def sel():
    print("余额查询")
    print("取钱")
    print("存钱")
    print("转账")
# 2.整体框架
def sel():
    nu = input("请选择:")
    if nu == "余额查询":
        print("你的余额还有1块钱")
    elif nu == "取钱":
        ll = int(input("请输入你的取款金额"))
        print("你的取款已经完成,取款:%d元" % ll)
    elif nu == "存钱":
        hh = input("请输入存款金额:")
        print(f'存款金额为{hh},交易已经完成')
    elif nu == "转账":
        ss = int(input("请输入转账账号:"))
        mm = int(input("请输入转账金额:"))
        print("交易成功")
passwd = int(input("请输入密码:"))
if passwd == 147258:
    print("请选择你需要办理的业务")
    sel()
else:
    print("密码输入错误,请重新输入")

函数注意事项

1.函数先定义后调用,如果先调用会报错

2.如果没有调用函数,函数里的代码则不会执行

3.函数执行流程:

​ 当调用函数时,解释器会回到定义函数的地方执行下方缩进的代码,当这些代码执行完毕,回到调用函数的地方继续向下执行

​ 定义函数的时候,函数体内的代码并不执行

函数参数

作用:封装代码,高效的代码重用

形参:函数定义时书写的 参数(非真实数据)

实参:函数调用时书写的参数(真实数据)

位置参数

调用函数时根据函数定义的参数位置来传递参数

注意:传递和定义参数的顺序个数必须一致

def user_info(name,age,gender):
    print(f'你的名字是{name},年龄是{age},性别是{gender}') 
user_info("laow",20,"男")

指定参数的数据类型

标准化输出,限制参数的数据类型

def hello(name,age):
    print("%s,%d" %(name,age))  #输出的数据类型
hello("闫",18)  # 闫,18

关键字参数

函数调用,通过“键=值“的形式加以指定。可以让函数更加清晰、容易使用,同时也清除了参数的顺序需求

注意:函数调用时,如果有位置参数时,位置参数必须在关键字参数的前面,但关键字参数之间不存在先后顺序

def user_info(gender,name,age):
    print(f'你的名字是{name},年龄是{age},性别是{gender}')
user_info("男",age=18,name="loaw") # 位置参数 gender要写在最前边,关键字参数先后顺序无所谓
# 输出结果:
你的名字是loaw,年龄是18,性别是男

缺省值参数

缺省参数也叫默认参数,用于定义函数,为参数提供默认值,调用函数时可不传该默认参数的值

**注意:**所有位置参数必须出现在默认参数之前,包括函数定义和调用。函数调用时,如果为缺省参数传值,则修改默认参数值,否则使用这个默认值

def user_info(gender,name,age=18):  # 缺省参数在最后
    print(f'你的名字是{name},年龄是{age},性别是{gender}')
user_info("男",name="loaw")   # 位置参数在最前
# 输出结果:
你的名字是loaw,年龄是18,性别是男

不定长参数

不定长参数也叫可变参数。用于不确定调用的时候会传递多少个参数(不传参也可以)的场景,此时,可用包裹(packing)位置参数,或者包裹关键字参数,来进行参数传递,会显得非常方便。

包裹位置传递

***args:**传进的所有参数都会被args变量收集,它会根据传进参数的位置合并为一个元组,args为元组类型数据,这就是包裹位置传递。

def user_info(*args):
    print(args)
user_info()
user_info("Tom",20,"男")
# 输出结果:
()  # 返回空元组
('Tom', 20, '男')  # 返回元组数据

def hello(a,b,*args):  # 不定长数据类型命名不固定
    print(a,b,j)
hello(1,2,5)  # 1 2 (5,)

包裹关键字传递

** **kwargs:**会存放所有未命名的变量参数,kwargs为字典类型数据,输入形式:变量名=值

def user_info(**kwargs):
    print(kwargs)
user_info(name="laow",age=18)
# 输出结果;
{'name': 'laow', 'age': 18}

def hello(a,b,*j,**ll):
    print(a,b,j,ll)
hello(1,2,5,5,name="laow",age=18) 
# 输出结果:
1 2 (5, 5) {'name': 'laow', 'age': 18}  

综上:无论是包裹位置传递还是包裹关键字传递,都是一个组包的过程

函数返回值

1.在函数中,如果需要返回结果给用户需要使用函数返回值

2.退出函数,会导致return下方的所有代码(函数体内容)不执行(退出当前函数)

return 返回值  #return返回结果给函数调用的地方

举例

def jj():
    return "helloworld"
a = jj()  #结果返回给函数
print(a)  # helloworld

函数返回值应用

需求:制作一个计时器,计算任意两个数字之和,并保存结果

def result(a,b):
    return a + b
a = result(5,9)
print(a)  # 14

函数说明文档

help()函数作用:查看函数的说明文档(函数的解释说明信息)

语法

定义函数说明文档

def 函数名(参数):
	"""说明文档的位置"""
	代码
	......

举例

def hh(a,b):
    """这是求和函数"""
    c = a + b
    print(c)
help(hh)  # 查看hh()函数的说明文档
# 输出结果
hh(a, b)
    这是求和函数

高级使用

def aa(a,b):  
	"""
	说明信息,自已定义和系统提示
	"""
	代码
	......

举例

def sum(a,b):
    """
    求和函数
    :param a:  参数1
    :param b:  参数2
    :return:  返回值
    """
    return a + b
help(sum)
# 输出结果:
sum(a, b)
    求和函数
    :param a:  参数1
    :param b:  参数2
    :return:  返回值

查看函数帮助文件

help(函数名称)

举例

help(sum)  #查看函数的帮助文档
# 输出结果:
sum(a, b)
    求和函数
    :param a:  参数1
    :param b:  参数2
    :return:  返回值

函数嵌套调用

所谓函数嵌套使用指的是一个函数里边又调用另外一个函数(减少代码量)

def hello():
    print("====A====")
    print("====B====")
    print("====C====")
def world():
    print("====1====")
    hello()  # 桥套调用hello()函数
    print("====2====")
    print("====3====")
world()
# 执行结果;
====1====
====A====
====B====
====C====
====2====
====3====

嵌套应用

打印图形

1.打印一条横线

def pr():
    print("-"*20)
pr()
# 输出结果:
--------------------

2.打印多条横线

def pr():
    print("-"*20)
def print_line(a):
    i = 1
    while i <= a:
        pr()
        i += 1
print_line(3)
# 输出结果:
--------------------
--------------------
--------------------

函数数学计算

1.求三个数的和

def hello(a,b,c):
    return a + b + c
a = hello(20,20,45)
print(a)  # 85

2.求三个数的平均值

def hello(a,b,c):
    return a + b + c
def world(a,b,c):
    return hello(a,b,c)/3
b = world(10,20,30)
print(b)  # 20.0

函数的变量

变量作用域

变量作用域指的是变量的生效范围,主要分为两类:局部变量和全局变量

局部变量

所谓局部变量是定义在函数体内部的变量,即只在函数体内部生效

局部变量作用:在函数体内部,临时保存数据,当函数调用完成后,则销毁局部变量

def test():
    a = 100  #局部变量a
    print(a)
test()  # 100
print(a) # 报错,因为在函数test中没有变量a

全局变量

全局变量:在函数体内、外都能够生效的变量

a = 100  # 定义全局变量
def test():
    print(a)
test()  # 100
def age():
    print(a)
age() # 100
修改全局变量

注意:

如果在函数内部直接修改全局变量,其实修改的不是全局变量,而是重新定义了一个新的局部变量

a = 100  # 声明全局变量
print(a)  # 100
def testA():
    a = 10  # 定义一个局部变量
    print(a)  
testA()  # 10
def testB():
    print(a)
testB()  # 100

函数体内部修改或定义全局变量:

**global:**在局部声明全局变量,前提是,声明global的区域要执行,否则不生效

如果全局变量需要在函数中修改,就需要使用global进行声明

a = 100
print(a) # 100
def testA():
    global a  # 声明修改的全局变量
    a = 10  # 为全局变量重新赋值
    print(a)
testA()  # 10
def testB():
    print(a)
testB()  # 10

对于可变数据类型的全局变量来说,因其指向的数据可以修改,所以不适用global时也可以修改全局变量

多函数程序执行流程

一般在实际开发过程中,一个程序往往由多个函数组成,并且多个函数共享某些数据

共用全局变量

a = 100  # 定义全局变量
def hello():
    global a  # 修改全局变量,当调用hello()函数的时候,修改全局变量才会生效
    a = "helloworld"
    print(a)
def world():
    print(a)
world()  # 100

返回值作为参数传递

将一个函数的返回值作为另外一个函数的参数

def hello():
    return 20
sum = hello()
def world(a):
    print(a)
world(sum)  # 20

函数的返回多个值

函数如何返回多个返回值?

# 错误书写,return下边的代码不会执行
def hello():  
    return 1
	return 2
# 正确写法	
def hello():
    return 1,2
a = hello()
print(a)  #(1,2)

注意:

​ 1.return a,b写法,返回多个数据的时候,默认值元组类型

​ 2.return后面可以连接列表、元组或字典,以返回多个值

# 返回列表
def hello():
   return [1,3,4,5,6]
a = hello()
print(a)  # [1, 3, 4, 5, 6]

#返回元组
def hello():
   return (1,3,4,5,6)
a = hello()
print(a)  # (1, 3, 4, 5, 6)

#返回字典
def hello():
   return {"name":"Python","age":18}
a = hello()
print(a)  # {'name': 'Python', 'age': 18}

拆包和交换变量值

拆包

拆包:元组

def return_num():
    return 100,200
a,b = return_num()   #关键点,元组有一个值们就用几个变量去接受
print(a)
print(b)
# 输出结果:
100
200

拆包:字典

字典的拆包,变量接受的时key值,需要用这个变量去调用字典的value值

dict1 = {"name":"laow","age":18}
a,b = dict1  # 变量接受key值

# 打印key值
print(a)  # name
print(b)  # age 

# 调用字典的value值
print(dict1[a])  # laow
print(dict1[b])  # 18

交换变量值

需求:有变量a = 100和b = 200,交换变量的值

方法一:

借助第三变量存储数据

a = 100
b = 200
# 设置中间变量
c = a  # 将a的值赋值到变量c
# a和b交换值
a = b  # 将b的值赋值到变量a
b = c  #将c也就是a的值赋值到变量b
# 输出a和b的值
print(a)  # 200
print(b)  # 100

方法二:

简便方法

a = 100
b = 200
a,b = b,a  # a和b交换值
print(a)  # 200
print(b)  # 100

引用

引用介绍

在Python中,值是靠引用来传递的(应用说到底也是要给变量)

当要给变量赋值以后,它的值就会有一个引用,不论这个是如何改变,这个应用是唯一的

我们可以通过id()来判断两个变量是否为同一个值的引用。我们可以将id值理解为那块内存的地址标识。

# int类型--不可变类型测试
a = 100
b = a
print(id(a))  # 140726569172336
print(id(b))  # 140726569172336
# a和b的id值是相同的,所以它们的引用是相同的

# 列表--可变类型测试
aa = [1,2,3]
bb = aa 
print(id(aa))  # 1428361925128
print(id(bb))  # 1428361925128
# aa和bb的id值是相同的,所以它们的引用是相同的
aa.append(11)  # 修改aa列表
print(aa)  # [1, 2, 3, 11]
print(bb)  # [1, 2, 3, 11]
print(id(aa))  # 1428361925128
print(id(bb))  # 1428361925128

引用当作实参

验证应用可以当实参的代码:

def test1(a):
    print(a)
    print(id(a))

    a += a
    print(a)
    print(id(a))
b = 100
test1(b)
c = [10,20]
test1(c)
# 输出结果:
100
140726569172336
200
140726569175536
[10, 20]
2465605440008
[10, 20, 10, 20]
2465605440008

可变类型和不可变类型

所谓可变类型与不可变类型指的是:数据能够直接进行修改,如果能直接修改那么就是可变,否则是不可变

可变类型

  • 列表

  • 字典

  • 集合

不可变类型

  • 整型
  • 浮点型
  • 字符串
  • 元组
已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 数字20 设计师:CSDN官方博客 返回首页