Python基础(四):函数部分小结

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

一级目录

二级目录

三级目录

一、函数定义和调用函数

函数是可以实现某种操作的代码块可以用它们构建更大的程序我们可以把一个代码块与其他代码块组合使用就像积木搭建房子一样。
在 Python 中可以通过 def 关键字来定义函数然后利用调用函数名来调用该函数。
定义函数

	def <函数名><参数列表>:
		<函数体>
		return<返回值列表>

调用函数是指运行函数定义中的代码如果我们定义了一个函数却从来不调用它那么这段代码就永远不会运行。
调用函数

	<函数名>(<参数列表>)
def sum_num():  #定义函数
    num1=10
    num2=12
    sum=num1+num2
    print("{}+{}={}".format(num1,num2,sum))

sum_num()  #调用函数只有调用了函数之前定义的函数才会运行
--------------------------------------------------------
输出结果
10+12=22

二、函数的参数传递

参数的作用
函数的参数增加函数通用性针对相同的数据处理逻辑能够适应更多的数据

  • 1、 在函数内部把参数当做变量使用进行需要的数据处理
  • 2、 函数调用时按照函数定义的参数顺序把希望在函数内部处理的数据通过参数传递

1、形参和实参

形参定义函数时小括号中的参数用来接收参数用在函数内部作变量使用。
实参调用函数时小括号中的参数使用来把数据传递到函数内部用的。

'''无参函数'''
def sum0_num():  #定义无参函数
    num1=10
    num2=12
    print("{}+{}={}".format(num1,num2,num1+num2))

sum0_num()  #调用函数只有调用了函数之前定义的函数才会运行
--------------------------------------------------------
输出结果
10+12=22
'''有参函数'''
def sum1_num( num1,num2) :  #定义有参函数
    print("{}+{}={}".format(num1,num2,num1+num2))

sum1_num(10,12)  #调用函数将实参传递给形参
--------------------------------------------------------
输出结果
10+12=22

2、可选参数和可变数量参数传递

可选参数传递
函数的参数在定义时可以指定默认值当函数被调用时如果没有传入对应的参数值则使用函数定义时的默认值代替。

def add(a,b=10):      #关键字参数此时的10是b的默认值
    result = a + b
    print(result)

# 调用
add(5)       #5会赋值给ab还是默认值10
add(4,7)    #此时4会赋值给a,7会赋值给b替换掉默认值10

实例2

def add1(a,b=10,c=4)
    result = a + b +c
    print(result)
    
add1(2,6)     #6默认会赋值给b
add1(2,c=6)   #指明将6赋值给c

可变数量参数传递
函数在定义时可通过星号实现可变数量参数带有星号的可变参数只能出现在参数列表的后面被当做是元组类型传递到函数中。

	def <函数名><参数1>,<*参数2>,<**参数3>:
		<函数体>
		return<返回值列表>
def test1(a,*args): # *args表示元组
    print(type(args))
    for i in args:
        a +=i
    return a
result=test1(1,2,3,4)
print(result)
---------------------------------------
输出结果
<class 'tuple'>
10
def test2(a,*b,**c): #**c代表字典
    print(type(c))
    print(a)
    print(b)
    print(c)
    
test2(1,2,3,4,name="小明",age=18,gender=True)
--------------------------------------------------
输出结果
<class 'dict'>
1
(2, 3, 4)
{'name': '小明', 'age': 18, 'gender': True}

3、参数位置和名称传递

参数位置传递
函数调用时实参默认采用按照位置顺序的方式传递给函数

参数名称传递
函数调用时按照形参名称输入实参的方式传递给函数参数之间的顺序可以任意调整。

<函数名><参数名>=<实际值>

三、 函数返回值 return

return 语句用来退出函数并将程序返回到函数被调用的位置继续执行。
Python 在调用函数时为了使得函数返回我们想要的值常用 return 来解决此问题。return 语句可以同时将 0 个、1 个或者多个函数运算后的结果返回函数被调用处的变量。

'''函数中没有return时'''
def test(a,b):
	s=a+b #可以使用变量来接收函数执行的结果
result=test(1,2)
print(result)
-----------------------------------------------------
输出结果
None

执行调用函数输出为 None没有结果输出因为调用函数时并没有接收 return 这个结果。

'''函数中有return时'''
def test(a,b):
	s=a+b
	return s  #用return来接收结果
result=test(1,2)
print(result)
-----------------------------------------------------
输出结果
3
def test(a,b):
    result=a+b
    return result #程序运行到所遇到的第一个return即返回退出函数调回调用处
    c=a-b #后面程序不再执行
    return c  
sum_result=test(10,12)
print(sum_result)
-----------------------------------------------------
输出结果
22
  • return 表示返回在哪里调用就返回到哪里程序运行到所遇到的第一个 return 即返回退出函数后续的代码都不会被执行直接跳到函数调用处。
  • return 返回值可以是一个数值一个字符串一个布尔值或一个列表、函数等。
  • return 可以返回多个值多个值时一元组类型保存。

四、 局部变量和全局变量

局部变量

定义在函数内部使用的变量仅在函数内部有效当函数退出时变量不存在。

def demo1():
    num=10
    print(num,id(num))
    num=20
    print("修改后num为{}地址为{}".format(num,id(num)))
          
demo1()
          
def demo2():
    num=100
    print(num,id(num))
demo2()

-------------------------------------------------------------------------
输出结果
10 2454820317776
修改后num为20地址为2454820318096
100 2454820509136

不同函数内部同名局部变量地址不同。

n=1
def func(a,b):
    c=a*b #c是局部变量a和b作为函数参数也是局部变量
    return c
s=func("happy",2)
print(c)
----------------------------------------------------------
输出结果
NameError                                 Traceback (most recent call last)
C:\Users\ADMINI~1\AppData\Local\Temp/ipykernel_12484/4292904185.py in <module>
----> 6 print(c)
NameError: name 'c' is not defined

从输出的结果来看这说明当函数执行完退出后内部的局部变量将被释放了这也说明局部变量是有生命周期的。
局部变量的生命周期就是变量从被创建到被系统回收的过程。

  • 1局部变量在函数执行时才会被创建
  • 2函数执行结束后局部变量被系统回收
  • 3局部变量在生命周期内可以用来存储函数内部临时使用到的数据。

全局变量

定义在函数外面的变量一般没有缩进在程序执行全过程有效。

num=10 #定义全局变量
def demo1():
    print(num,id(num))
          
demo1()
          
def demo2():
    print(num,id(num))
demo2()
print("over") 
----------------------------------
输出结果
10 2454820317776
10 2454820317776
over   

全局变量在不同的函数中的值和地址是一样的。
在函数内部如何使用全局变量可以使用 global 关键字修改全局变量。

num=50
def demo1():
    print("demo1"+"-"*50)
    global num  #global关键字告诉Python要修改全局变量在函数内部不能直接用赋值语句修改全局变量
    num=100
    print(num,id(num))
          
demo1()
          
def demo2():
    print("demo2"+"-"*50)
    print(num,id(num))
demo2()
------------------------------------------------------------
输出结果
demo1--------------------------------------------------
100 2454820509136
demo2--------------------------------------------------
100 2454820509136

为了保证所有的函数都能够正确使用到全局变量应该将全局变量定义在函数的上方。
函数执行时需要处理变量时

  • 1首先查找函数内部是否存在执行名称的局部变量如果有直接使用。
  • 2如果没有查找函数外部是否存在执行名称的局部变量如果有直接使用。
  • 3如果还没有程序将报错。
    如果全局变量时个列表如何在函数中修改全局变量
ls=[] #ls是全局列表变量
def func(a,b):
    ls.append(b) #将局部变量b增加到全局列表变量ls中
    return a*b
s=func("happy",2) #测试ls值是否改变
print(s,ls)
-------------------------------------------------------------
输出结果
happyhappy [2]

从结果来看ls 列表值改变了函数内部如果没有被真实创建的同名变量则函数内部可以直接使用并修改全局变量的值。

ls=[] #ls是全局列表变量
def func(a,b):
    ls=[] #创建了名称为ls的局部列表变量
    ls.append(b) #将局部变量b增加到全局列表变量ls中
    return a*b
s=func("happy",2) #测试ls值是否改变
print(s,ls)
-------------------------------------------------------------
输出结果
happyhappy [ ]

从结果来看ls 列表值没有改变如果函数内部真实创建了列表同名的变量无论是否有同名全局变量函数仅对局部变量进行操作函数退出后局部变量被释放全局变量值不变。

函数变量的总结

Python 函数对变量的作用个遵守如下原则

  • 1简单数据类型整型、浮点型、字符串变量无论是否与全局变量重名仅在函数内部创建和使用。函数退出后变量被释放如果有全局同名变量其值不变。
  • 2简单数据类型整型、浮点型、字符串变量在用 global 保留字声明后作为全局变量使用函数退出后该变量保留且值被函数改变。
  • 3对于组合数据类型列表元组、集合、字典的全局变量如果在函数内部没有被真实创建的同名变量则函数内部可以直接使用并修改全局变量的值。
  • 4如果函数内部真实创建了组合数据类型的变量无论是否有同名全局变量函数仅对局部变量进行操作函数退出后局部变量被释放全局变量值不变。

五、lambda函数(匿名函数)

<函数名>=lambda<参数列表>:<表达式>

举例

s = lambda a, b: a + b
result = s(1, 2)
print(result)
---------------------------------
输出结果
3

匿名函数作为参数

def func(x, y, func):
    s = func(x,y)
    print(s)

# 调用
func(1, 2, lambda a, b: a + b)
---------------------------------
输出结果
3
阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
标签: python