Python 函数是什么 学习笔记

函数是什么

函数是组织好的、可以重复使用的、用来实现单一功能的代码。比如说当我们需要实现“打印”这个功能,我们会用到print();当我们需要实现“获取数据长度”这个功能,我们会要到len()。而“print()”、“len()”都是我们的函数。
在这里插入图片描述

定义和调用函数

定义函数

定义函数的语法书写:def 函数名(参数名)(注:括号内可以为空,也可以为多个参数,多个参数间用逗号隔开即可)
自动检测
def 函数名(参数1,参数2,…参数n):
函数体
return 语句
函数内部一旦遇到return语句,就会停止执行并返回结果。没有return语句的函数,Python也会在末尾隐性地加上return None,即返回None值(return None可以简写为return。)
在这里插入图片描述

调用函数

(1)不带参数的函数
自动检测

def A():
print(‘山脚毕业’)
A()

不带参数的函数调用:直接函数名+括号可调用(运行)函数。
(2)带参数的函数
其实我们的打印语句 print() 也是一个内置函数,他的格式大概如下:
自动检测

def print(‘字符串’):
(打印’字符串’内容)
print(‘字符串’)

以 print() 函数的形式来看后,我们会更好理解带参数的函数是怎么调用的,这里再举一个例子:
自动检测

def teacher(name):
print(name)
teacher(‘七七’)

这里我们定义了函数 teacher,并带有参数 name。这里的 name 相当于一个钥匙孔,teacher 相当于是一道门,如果我们没有用钥匙打开这个孔,我们就不能打开这道门去用里面的东西。所以为了打开 teacher 这道门,我们用了 ‘七七’ 这个钥匙成功打开(赋值)给 name ,才能让我们使用里面的打印函数。

函数重要概念

默认参数

默认参数必须放在位置参数之后。若调用函数时没有传递参数就为默认值,但如果调用时向默认参数传递了数据,则默认参数被新参数代替。
自动检测

def menu(appetizer,course,dessert=‘绿豆沙’):
print(‘一份开胃菜:’+appetizer)
print(‘一份主食:’+course)
print(‘一份甜品:’+dessert)
menu(‘话梅花生’,‘牛肉拉面’)

#结果显示为:因为调用时只给了两个参数,第三个参数为默认值

#一份开胃菜:话梅花生
#一份主食:牛肉拉面
#一份甜品:绿豆沙

menu(‘话梅花生’,‘牛肉拉面’,‘银耳羹’)

#结果显示为:因为调用时给了三个参数,第三个参数被更新

#一份开胃菜:话梅花生
#一份主食:牛肉拉面
#一份甜品:银耳羹

不定长参数

一个星号*加上参数名。当传入此处的参数数量不确定时使用,数据类型为元组(元组(tuple):写法是把数据放在小括号()中,它的用法和列表用法类似,主要区别在于列表中的元素可以随时修改,但元组中的元素不可更改。列表一样,元组是可迭代对象,这意味着我们可以用for循环来遍历它)。
当默认参数在不定长参数后时,若想更改默认参数,需要注明dessert=‘银耳羹’,例如:
自动检测

def menu(appetizer,course,*barbeque,dessert=‘绿豆沙’):
print(‘一份开胃菜:’+appetizer)
print(‘一份主菜:’+course)
print(‘一份甜品:’+dessert)
for i in barbeque:
print(‘一份烤串:’+i)
menu(‘话梅花生’,‘牛肉拉面’,‘烤鸡翅’,‘烤茄子’,‘烤玉米’,dessert=‘银耳羹’)

#结果显示为:

#一分开胃菜:话梅花生
#一份主菜:牛肉拉面
#一份甜品:银耳羹
#一份烤串:烤鸡翅
#一份烤串:烤茄子
#一份烤串:烤玉米

当默认参数在不定长参数之前,则默认按顺序传递参数(默认参数会改变),剩下的参数均传递给不定长参数。
自动检测

def menu(appetizer,course,dessert=‘绿豆沙’,*barbeque):
print(‘一份开胃菜:’+appetizer)
print(‘一份主菜:’+course)
print(‘一份甜品:’+dessert)
for i in barbeque:
print(‘一份烤串:’+i)
menu(‘话梅花生’,‘牛肉拉面’,‘银耳羹’,‘烤鸡翅’,‘烤茄子’,‘烤玉米’)

#结果显示为:

#一分开胃菜:话梅花生
#一份主菜:牛肉拉面
#一份甜品:银耳羹
#一份烤串:烤鸡翅
#一份烤串:烤茄子
#一份烤串:烤玉米

return 语句

我们的长度计算语句 len() 也是一个内置函数,他的格式大概如下:
自动检测

def len(‘内容’):
(计算’内容’长度)
return 长度值
a=‘内容’
print(len(a))

这里再举一个例子来解释 return 语句:
自动检测

def A():
name = ‘七七’
return name
print(A())

这里我们函数 A 定义的内容给变量 name 赋值 ‘七七’,并且返回(return)了这个值,在代码第 5 行,我们打印了这个函数,因为返回了值 name ,所以会打印出 ‘七七’。
注意:执行了 return 语句后,return 下面的语句不执行(这里依旧只打印出七七)
自动检测

def A():
name = ‘七七’
return name
print(‘卡西’)
print(A())

在这里插入图片描述

变量作用域

局部变量

在函数内定义的变量,仅能在函数内部使用(局部作用域)
自动检测

def A():
name=‘七七’
print(name)

上面的语句会报错,因为 name 是函数内的变量(即局部变量)。

全局变量

所有函数之外赋值的变量,可以在程序的任何位置使用(全局作用域)
自动检测

teacher = ‘七七’
def A():
name=‘卡西’
print(teacher)
print(teacher)
A()

上面的语句运行后会打印两次 “七七”,因为变量 teacher 是全局变量,执行函数的时候可以正常打印出 teacher。

global 语句

可以将局部变量转换为全局变量,一般写在函数体的第一行
自动检测

def A():
global name
name=‘七七’
A()
print(name)

以上语句将我们的局部变量 name 转换为全局变量,让我们在外部也能正常打印 name。(注意:一定要执行了函数 A ,才会执行 global 语句,才能将局部变量转换为全局变量)

易错点

局部变量和全局变量尽量不要取相同的名字,以免混淆
自动检测

sum = 0
def A():
sum = sum + 1
print(sum)
A()

上面的代码会报错:“UnboundLocalError: local variable ‘sum’ referenced before assignment”,原因是什么呢?这是因为我们运行函数 A 时, sum = sum + 1 语句中,第一个 sum 是我们函数内的局部变量,而第二个 sum ,系统分辨不出是全局的还是局部的,懵了一下跟我们说我不清楚,所以要改正的话需要将局部变量转化全局变量:
自动检测

sum = 0
def A():
global sum
sum = sum + 1
print(sum)
A()

函数嵌套

sum = rent + cost() 的结果就是sum = rent + variable_cost(cost()函数的返回值)。最后调用函数时,也只需调用sum_cost()即可。
自动检测

rent = 3000
def cost():
utilities = int(input(‘请输入本月的水电费用’))
food_cost = int(input(‘请输入本月的食材费用’))
variable_cost = utilities + food_cost
print(‘本月的变动成本是’ + str(variable_cost))
return variable_cost
def sum_cost():
sum = rent + cost()#调用函数
print(‘本月的总成本是’ + str(sum))
sum_cost()

知识拓展

list() 函数

可以将数据转换为列表
自动检测

a=‘七七’
a=list(a)
print(a)
结果为:[‘七’, ‘七’]

reversed() 函数 (以下仅做参考)

reversed()函数可以将数据反转,从后往前迭代。
reversed()之后,第二次for循环、list()、tuple()以及join()得到的结果都为空,原因就是b不是反转列表本身,而是一个列表反向迭代器,所以直接输出函数返回值会是类似于乱码,且reversed()之后,只在第一次遍历时返回值。
自动检测
参数是列表1:

a=[1,2,3,4,5]
b=reversed(a)
print(a)

结果显示为:

#[1, 2, 3, 4, 5]
print(b)

结果显示为:
<listreverseiterator object at 0x06A9E930>

for i in b:#第一次遍历
print(i)

结果显示为:

#5 4 3 2 1
for i in b:#第二次遍历为空
print(i)

结果显示为:啥也没有

自动检测
参数是列表2:

a=[1,2,3,4,5]
b=reversed(a)
print(list(b))#第一次转换为列表
#结果显示为:
#[5,4,3,2,1]
print(list(b))#第二次

结果显示为:

#[]

自动检测
#参数是元组

t=(4,5,6)
tt=reversed(t)
print(t)

结果显示为:

#(4, 5, 6)
print(tt)

结果显示为:

<reversed object at 0x06A07E50>
print(tuple(tt))

第一次转换为元组
结果显示为

(6, 5, 4)

print(tuple(tt))
#第二次为空
#结果显示为()

自动检测
#参数是字符串

s=‘cba’
ss=reversed(s)
print(s)
#结果显示为
‘cba’
print(ss)
#结果显示为
<reversed object at 0x06A07E70>
print(list(ss))#第一次转换为列表
结果显示为
[‘a’, ‘b’, ‘c’]
print(list(ss))#第二次为空
#结果显示为
[]

おすすめ

転載: blog.csdn.net/qq_44992918/article/details/109148186
おすすめ