3.1 def语句和参数
def ...(...)语句用于定义一个函数,以便后面调用函数,如:
def hello(name): #定义函数hello,变元name
print('hello' + name) #打印hello+变元name
namein = input() #定义namein变量,从键盘取值并赋给namein
hello(namein) #调用hello函数,将namein的变量赋值给变元name。
需注意:函数被调用并返回后,在变元中的值就丢失了。
3.2 返回值和return语句
def语句创建函数时,可以用return语句指定应该返回什么值,如
import random
def getAnswer(answerNumber): #定义一个函数getAnswer,变元answerNumber
if answerNumber == 1:
return 'It is certain' #当变元为1时,打印这个结果,下述同理。
elif answerNumber == 2:
return 'It is decidedly so'
elif answerNumber == 3:
return 'Yes'
elif answerNumber == 4:
return 'Reply hazy try again'
elif answerNumber == 5:
return 'Ask again later'
elif answerNumber == 6:
return 'Concertrate and ask again'
elif answerNumber == 7:
return 'My reply is no'
elif answerNumber == 8:
return 'Outlook not so good'
elif answerNumber == 9:
return 'Very doubtful'
r = random.randint(1, 9) #定义变量r,调用内建函数random,其范围是1到9
fortune = getAnswer(r) #运行自建函数getAnswer,变元值为r。
print(fortune) #打印fortune中的存储结果
3.3 None值
None表示没有值,是NoneType数据类型的唯一值。
注意,print()函数是没有返回值的,与none值相同。
可以通过:
spam = print('Hello')
None == spam
#返回结果为True得出。
3.4关键字参数和print()
关键字是由在调用函数时选用的,通常用于可选变元。
如print中的 end、, 、seq函数。
#end=''
print('Hello',end=' ')
print('World')
结果→→Hello World
# ','
print('Cat','Dog','Mice')
结果→→Cat Dog Mice
# seq = ''
print('Cat','Dog','Mice',sep=',')
结果→→Cat,Dog,Mice
3.5 局部和全局作用域
全局指在本程序中一直生效,局部是指在程序的某一个局部中生效,如果退出局部则失效。
def spam():
eggs = 99 #局部变量1
bacon() #此处局部变量2会被打印,对于spam()来说,这里就是局部
print(eggs) #此处打印结果为99,因为bacon()执行后,bacon()中的局部变量失效了
def bacon():
ham = 101
eggs = 0 #局部变量2
spam()
bacon()
全局变量可以和局部变量重名,但我们尽量让他们之间不要重名。
***
def spam():
print(eggs)
eggs = 42 #全局变量1
spam()
print(eggs)
上代码中的局部变量eggs在
打印时引用了全局变量。
总结:全局会被局部引用,局部不会被全局引用,要想运行轻松点,就要注意别重名啦。
3.6 global语句
为函数命名时加上global语句如“global eggs = 1”,就可以让python知道在这代码全局中所有的eggs函数都值都为1。
函数中一个人变量要么总是全局变量,要么总是局部变量。
3.7 异常处理
由于你不知道用户输入的变元是什么,所以你需要在他们执行前执行一次检查,以免程序直接出错跳出。
#CODE
def spam(divideBy):
try:
return 42 / divideBy
except ZeroDivisionError:
print('错误:无效输入')
print(spam(2))
print(spam(12))
print(spam(0))
print(spam(1))
#OUTPUT
21.0
3.5
错误:无效输入
None
42.0
3.8 猜数字游戏
#This is a guess number game.
import random
SecretNumber = random.randint(1,20)
print('I have a number, come on and guess.')
#print('PLZ enter a number.')
#Ask the player to guess 6 times.
for guessesTaken in range(1,7):
print('PLZ enter a number.')
guess = int(input())
if guess < SecretNumber:
print('Your number is too low.')
elif guess > SecretNumber:
print('Your number is too high.')
else:
break # This condition is the correct guess!
if guess == SecretNumber:
print('Good job! You guessed my number in ' + str(guessesTaken) + ' times.')
else:
print('Nope. The number I was thinking of was ' + str(SecretNumber))
3.9 本章习题
1.为什么在程序中加入函数会有好处?
函数快,可以消除重复,让代码更短,读起来也更容易。
2.函数中的代码何时执行:在函数被定义时,还是在函数被调用时?
在函数被调用时执行。
3.什么语句创建一个函数?
def语句创建函数。
4.一个函数和一次函数调用有什么区别?
函数是一个开头为def的语句,它包含函数名和函数体。如def guess()
而函数之后的guess()是一次函数调用,只有当代码执行到guess()时,才会调用函数def guess()下面的函数体。
5.Python 程序中有多少全局作用域?有多少局部作用域?
在调用函数时,创建了一个全局作用域和一个局部作用域。
6.当函数调用返回时,局部作用域中的变量发生了什么?
清空。
7.什么是返回值?返回值可以作为表达式的一部分吗?
返回值即函数执行结束后的返回结果,他可以作为表达式的一部分。
8.如果函数没有返回语句,对它调用的返回值是什么?
None
9.如何强制函数中的一个变量指的是全局变量?
global xxx 则 xxx 被强制为一个全局变量。
10.None 的数据类型是什么?
none.type
11.import areallyourpetsnamederic 语句做了什么?
导入了一个名为areallyourpetsnamederic的函数,
12.如果在名为 spam 的模块中,有一个名为 bacon()的函数,在引入 spam 后,如何调用它?
spam.bacon()
13.如何防止程序在遇到错误时崩溃?
try
except
函数进行验证
14.try 子句中发生了什么?except 子句中发生了什么?
try句子中运行了你的表达式,如果产生错误,则转到except。
之后程序照常运行。
3.11 代码实践
3.11.1
编写一个名为 collatz()的函数,它有一个名为 number 的参数。如果参数是偶数,那么 collatz()就打印出 number // 2,并返回该值。如果 number 是奇数,collatz()就打印并返回 3 * number + 1。
然后编写一个程序,让用户输入一个整数,并不断对这个数调用 collatz(),直到函数返回值1(令人惊奇的是,这个序列对于任何整数都有效,利用这个序列,你迟早会得到 1!既使数学家也不能确定为什么。你的程序在研究所谓的“Collatz序列”,它有时候被称为“最简单的、不可能的数学问题”)。
记得将 input()的返回值用 int()函数转成一个整数,否则它会是一个字符串。 提示 如果 number % 2 == 0,整数 number 就是偶数,如果 number % 2 == 1,它就是奇数。
这个程序的输出看起来应该像这样:
Enter number:
3
10
5
16
8
4
2
1
def collatz(dd):
global number
number = dd
while number != 1:
if number % 2 == 0:
number = number // 2
print(number)
elif number % 2 == 1:
number = number * 3 + 1
print(number)
3.11.2
在前面的项目中添加 try 和 except 语句,检测用户是否输入了一个非整数的字符串。正常情况下,int()函数在传入一个非整数字符串时,会产生 ValueError 错误,比如 int('puppy')。在 except 子句中,向用户输出一条信息,告诉他们必须输入一个整数。
try:
nm1 = int(input('请输入一个数字\n'))
except ValueError:
print('请输入正确的数字!')
else:
print(collatz(nm1))
网友评论