def函数
def定义一个函数
包含
- def关键字
- 函数名
- 括号()函数都需要一个括号
- 参数 括号的内参数
- 冒号
- 下一行开始,缩进的代码块
def an() : #自定义的函数
print('你好!') #函数的内容
an(); #调用函数
an(); #调用函数
参数的调用
def an(ac) : # 自定义的函数ac为变量,再此称为变元
print('你好!' + ac) # 函数的内容
an('先生') # 函数调用,是的参数为 先生,变量ac设置为 先生 输出
定义,调用,传递,参数,变元
定义:一个函数就是创建一个函数,def an(ac)创建了一个an()的函数
调用:调用刚才创建的函数,并将执行转到函数代码的开始处
传递:an(‘先生’)将字符串‘···’传递给该函数
参数:被传递过来的字符串‘···’就是参数,参数被赋给名为ac的局部变量
变元:接收参数赋值的变量是变元,变元只有该函数使用,在函数放回就丢失,试图在别的不相关的函数使用改变元(空的),会报错
返回值和return语句
返回值:函数调用求值的结果,例:len(“hello”)返回值为整数5
在用def语句创建时可以,可以用return语句指定放回什么值,
包含以下部分
1.return关键字
2.函数应该返回值或表达式(使用表达式就是返回表达式求值的结果)
from random import *
def computernum(num): #变元
if num == 1:
return '你好我是1' #指定返回值
elif num == 2:
return '你好我是2' #指定返回值
else:
return '你好我是3' #指定返回值
num2 = randint(1,3) #随进输出1-3
print(computernum(num2)) #输出指定的返回值
None值
在python中有一个值称为None,表示没有值,None是NoneType数据类型的的唯一值。首字母必须大写。几乎所有的函数都需要返回值,print()函数的返回值就是None
num = print('hello')
print(None == num)
关键字参数和print()函数
大多数参数是由它们在函数调用中的位置来识别,例如: random.randint(1,10)与random.randint(10,1
) 不同
函数调用前一条将放回1-10之间的随机整数,第一个参数是范围的下界,第二个是参数的上界,第二条则错误
关键字参数是在函数调用它们前面的关键字来识别,关键字参数通常是用于可选变元,例: print()函数有可选变元end和sep,分别指定在参数的末尾输出什么,以及在参数之间输出什么来隔开它们。
print('hello') #输出hello
print('word') ##输出word
print('hello' '' 'word') #输出helloword,空格和空字符被忽略了
print('hello',end='') #输出helloword ,print自动在字符串的末尾添加了换行符
print('word') #end参数将换行符换成了空字符,就在同一行显示了
print('hello','word') #print函数遇到多个字符串值,会自动用空格把值分开
print('hello','word',sep='1') #sep参数指定某个字符来代替空格,分割字符串
调用栈
调用栈是python记住每个函数调用在哪里返回执行的方式
python的后台在处理它,当程序在调用一个函数是,Python在顶部创建一个帧对象,帧对象保存了最初函数调用的行号,且在前一个帧对象之上,当函数值返回时,python从栈顶部删除一个帧对象,并将执行转换至保存在其中的行号,帧对象始终是从栈的顶部添加或删除。
def a(): #创建一个函数
print('程序开始') #函数函数
b() #调用函数b,b()函数的放回值会被执行到这里
print('结束') #函数结尾
def b(): #创建另一个函数
print('程序执行中') #放回一个输出值
a() #调用函数
局部变量和全局表量
一个变量必须属于以下一种
局部变量:函数内被调用的变元和变量,处于该函数的局部作用域中
全局变量:函数之外赋值的变量,处于全局作用域中
作用域:变量的容器,当作用域被销毁时,所有保存在该区域内的变量值被丢弃,只用一个全局的作用域,在程序开始时创建,程序停止时被销毁,它的所有变量被丢弃,否则程序在下次执行还还记得它们上次运行的值
一个函数被调用就创建了一个局部作用域,在这个函数内所有的赋值的所有变量,存在与该局部作用域内,改函数返回时,这个局部作用域就被注销,这些变量就丢失了,下次调用这个函数,局部变量不会记得该函数上次被调用时它们保存的值
作用域的几个要点
1.全局作用域中的代码不能使用任何局部变量
2.局部作用域中的代码可以访问全局变量
3.一个函数的局部作用域中的代码,不能使用其他局部作用域的变量
4.在不同的作用域中,你可以用相同的名字命名不同的变量,一个num变量可以在局部变量使用,也可以在全局变量中使用同样的变量名。
python设计了不同的作用域,而不是所有的变量都使用全局变量,当特定函数调用中代码来修改变量是,该函数与程序其他部分的交互只能通过它的参数和返回值进行,缩小了可能导致bug的代码作用域。在出现时能就能很快知道是哪一个函数中代码出错。
局部作用域
def a(): #创建一个函数
--num = 1
--print(num)
a() #调用
print(num) #报错,局部变量不嫩在全局作用域内使用
局部作用域 一个函数中的局部变量要完全与其他的函数中的局部变量分隔开来
def a(): #创建一个函数
num = 1 #变量赋值
b() #调用函数b()
print(num) #输出变量
def b(): #创建另一个函数
num = 2 #变量赋值
a() #调用函数a()
全局变量可以在局部作用域中读取
def a(): #创建一个函数
print(num) #输出变量值
num = 1 #给全局变量赋值
a() #调用函数a()
名称相同的局部变量和全局变量
num = 3 #num全局变量
def a():
num = 1 #num局部变量
print(num)
def b():
num = 2 #num局部变量
print(num)
a()
b()
print(num)
三个独立的变量都有相同的名字,追踪某一个时候在使用那个变量,可能很比较麻烦
# 在一个局部变量中修改一个全局变量的值
num = 0 #变量赋初值
def a():
global num #使用global语句指定num为全局变量
num = 1 #修改了全局变量num的值
a()
print(num)
global语句(在一个函数内修改全局变量)
四条法则区分作用域
1.如果变量在全局作用域中使用(即在所有函数之外),它就是全局变量
2.如果在一个函数中,有针对该变量的global语句,他就是全局变量
3.如果该变量用于函数中的赋值语句,该函数就是局部变量
4.如果改变量没有用在赋值语句中,它就是全局变量
num=0 # 全局变量
def a():
global num # 全局变量
num = 1
def b():
num = 2 # 局部变量
def c():
print(num) # 全局变量,这个语句中既没有赋值语句,也没有针对它的global语句
在函数中,如果试图在局部变量赋值前使用就使用它会报错
# 无法执行的程序
num=0 # 全局变量
def a():
print(num) #!!!报错!!!!函数的子句中有针对num的赋值语句,认为函数是一个局部变量不会退回使用之前的全局变量
num = 1 #在执行输出前局部变量num不存在
a()
#无法执行的程序
num=0
def a():
print(num) #!!!报错!!!!函数的子句中有针对num的赋值语句,也被指定为全局变量了但是,不能在全局声明之前使用
global num
num = 1
a()
# 实验三
num=0 #全局变量
def a():
global num #指定为全局变量
print(num) #函数的子句中有针对num的赋值语句,设定了num为全局变量,在使用赋值
num = 1
a()
try和except异常处理
将可能出错的语句放在try语句的子句中,如果发生了错误,程序执行就转到except的子句开始处,不会在回到try子句中
while True:
try: #错误捕捉语句
num = input('请输入密码:') #输入不能装换为整型的字符串,在下一行报错
if int(num) == 123456 : #字符型和整型无法做比较,报错
break #输入正确跳出循环
except: #当输入不能装换为整型的字符串,被try语句捕捉
print('输入不正确') #程序跳转到except语句的子句开始处
print('验证成功') #提示跳出循环了
总结
1.函数减少了重复的代码,让程序更加简短,容易阅读,修改
2.函数是代码逻辑分组的组成方式
3.函数中的代码块在函数被调用时执行,而不是定义函数的时候
3.在调用一个函数时最少有一个局部作用域和一个全局作用域
4.当函数返回值后,局部作用域内的变元保存的值被销毁
5.在觉得会出现错的的代码块放进try语句中…