Python随手笔记(四)

本文目录

4.1 def语句和参数

4.2 关键字参数和 print()

4.3 局部和全局作用域

4.4 global 语句

4.5 异常处理

4.6 小结

4.7 小游戏:猜数字(娱乐)

4.8 实践项目:Collatz 序列

Python提供了一些内建函数,同时也支持自己定义的函数,每个函数就像一个程序里的小程序

4.1 def语句和参数

def语句中可以加入一些参数放到括号之中,有个小例子:

def hello(a):
    print('Hello, '+ a)
hello('吕世龙')

如果调用 len()函数,并向它传入像’Hello’这样的参数,函数调用就求值为整数 5。这是传入的字符串的长度。一般来说,函数调用求值的结果,称为函数的返回值。return 语句包含以下部分:

  • return 关键字
  • 函数应该返回的值或表达式

如果使用不带值的 return 语句(也就是只有 return 关键字本身),那么就返回 None。

4.2关键字参数和 print()

大多数参数是由它们在函数调用中的位置来识别的。例如,random.randint(1, 10)
与 random.randint(10, 1)不同。函数调用 random.randint(1, 10)将返回 1 到 10 之间的一个随机整数,因为第一个参数是范围的下界,第二个参数是范围的上界(而random.randint(10, 1)会导致错误)。
但还有一类关键字参数,是由函数调用时加在它们前面的关键字来识别的,例如,print()函数有可选的变元 end 和 sep,分别指定在参数末尾打印什么,以及在参数之间打印什么来隔开它们。

print('hello',end='')
print('world')
输出结果:helloworld
print('王大','牛二','吕世龙',sep=',')
输出结果:王大,牛二,吕世龙

4.3 局部和全局作用域

在被调用函数内赋值的变元和变量,处于该函数的“局部作用域”。在所有函数之外赋值的变量,属于“全局作用域”。处于局部作用域的变量,被称为“局部变量”。处于全局作用域的变量,被称为“全局变量”。一个变量必是其中一种,不能既是局部的又是全局的。
一个函数被调用时,就创建了一个局部作用域。在这个函数内赋值的所有变量,存在于该局部作用域内。该函数返回时,这个局部作用域就被销毁了,这些变量就丢失了。下次调用这个函数,局部变量不会记得该函数上次被调用时它们保存的值。作用域很重要,理由如下:

  • 全局作用域中的代码不能使用任何局部变量
  • 但是,局部作用域可以访问全局变量
  • 一个函数的局部作用域中的代码,不能使用其他局部作用域中的变量
  • 如果在不同的作用域中,你可以用相同的名字命名不同的变量。也就是说,可以有一个名为 spam 的局部变量,和一个名为 spam 的全局变量。
def spam():
 eggs = 31337
spam()
print(eggs)

这个例子中全局作用域中调用了局部变量,所以这个程序会报错。
eggs 变量只属于 spam()调用所创建的局部作用域。在程序执行从 spam 返回后,该局部作用域就被销毁了,不再有名为 eggs 的变量。所以当程序试图执行 print(eggs),Python 就报错,说 eggs 没有定义。
2.局部作用域不能使用其他局部作用域内的变量
一个函数被调用时,就创建了一个新的局部作用域,这包括一个函数被另一个
函数调用时的情况。请看以下代码:

def spam():
	eggs = 99 
	bacon() 
	print(eggs) 
def bacon():
    ham = 101
	eggs = 0 
spam()

在程序开始运行时,spam()函数被调用,创建了一个局部作用域。局部变量
eggs,并被赋值为99。然后 bacon()函数被调用,创建了第二个局部作用域。多个局部作用域能同时存在。在这个新的局部作用域中,局部变量 ham 被赋值为101。局部变量 eggs(与 spam()的局部作用域中的那个变量不同)也被创建,并赋值为 0。当 bacon()返回时,这次调用的局部作用域被销毁。程序执行在spam()函数中继续,打印出 eggs 的值。因为 spam()调用的局部作用域仍然存在,eggs 变量被赋值为 99。这就是程序的打印输出。
3.全局变量可以在局部作用域中读取
下面有一个例子:

def spam():
 print(eggs)
eggs = 42
spam()
print(eggs)

因为在 spam()函数中,没有变元名为 eggs,也没有代码为 eggs 赋值,所以当
spam()中使用 eggs 时,Python 认为它是对全局变量 eggs 的引用。这就是前面的程序运行时打印出 42 的原因。
4.应该避免在不同作用域内使用相同变量名。

4.4 global 语句

如果需要在一个函数内修改全局变量,就使用 global 语句。如果在函数的顶部
有 global eggs 这样的代码,它就告诉 Python,“在这个函数中,eggs 指的是全局变量,所以不要用这个名字创建一个局部变量。”

def spam():
  global eggs 
  eggs = 'spam' 
eggs = 'global'
spam()
print(eggs)
------------------------------------
输出结果自然为:spam

有 4 条法则,来区分一个变量是处于局部作用域还是全局作用域:
1.如果变量在全局作用域中使用(即在所有函数之外),它就总是全局变量。
2.如果在一个函数中,有针对该变量的 global 语句,它就是全局变量。
3.否则,如果该变量用于函数中的赋值语句,它就是局部变量。
4.但是,如果该变量没有用在赋值语句中,它就是全局变量。

4.5 异常处理

到目前为止,在 Python 程序中遇到错误,或“异常”,意味着整个程序崩溃。
你不希望这发生在真实世界的程序中。相反,你希望程序能检测错误,处理它们,然后继续运行。
下面这个例子出现了除数为0的情况,如果直接运行一定会报错。

def spam(divideBy):
 return 42 / divideBy
print(spam(2))
print(spam(12))
print(spam(0))
print(spam(1))

当试图用一个数除以零时,就会发生 ZeroDivisionError。错误可以由 try 和except 语句来处理。那些可能出错的语句被放在 try 子句中。如果错误发生,程序执行就转到接下来的 except 子句开始处。可以将前面除数为零的代码放在一个 try 子句中,让 except 子句包含代码,来处理该错误发生时应该做的事。
改正后:

def spam(divideBy):
 try:
 return 42 / divideBy 
 except ZeroDivisionError:
 print('Error: Invalid argument.') 
print(spam(2))
print(spam(12))
print(spam(0))
print(spam(1))

4.6 小结

函数是将代码逻辑分组的主要方式。因为函数中的变量存在于它们自己的局部
作用域内,所以一个函数中的代码不能直接影响其他函数中变量的值。这限制了哪些代码才能改变变量的值,对于调试代码是很有帮助的。函数是很好的工具,帮助你组织代码。在前面几章中,一个错误就可能导致程序崩溃。
在本章中,你学习了 try 和 except语句,它们在检测到错误时会运行代码。这让程序在面对常见错误时更有灵活性。

4.7 小游戏:猜数字(娱乐)

现在让我们看一看,如何将所学的知识综合起来,编写一个更完整的程序。在本节中,我将展示一个简单的猜数字游戏。

import random
guessnumber = random.randint(1, 100)
print('This number is between 1 and 100.')
# Ask the player to guess 5 times.
for guessesTaken in range(1, 6):
 print('Take a guess.')
 guess = int(input())
 if guess < guessnumber:
    print('Your guess is low.')
 elif  guess > guessnumber:
    print('Your guess is high.')
 else:
    break
if guess == guessnumber:
 print('Good job! You guessed my number in ' + str(guessesTaken) + ' times!')
else:
 print('Nope. The number I was thinking of was ' + str(guessnumber))

在这里插入图片描述

4.8 实践项目:Collatz 序列

编写一个名为 collatz()的函数,它有一个名为 number 的参数。如果参数是偶数,那么 collatz()就打印出 number // 2,并返回该值。如果 number 是奇数,collatz()就打印并返回 3 * number + 1。
然后编写一个程序,让用户输入一个整数,并不断对这个数调用 collatz(),直
到函数返回值1(令人惊奇的是,这个序列对于任何整数都有效,利用这个序列,你迟早会得到 1!既使数学家也不能确定为什么。你的程序在研究所谓的“Collatz序列”,它有时候被称为“最简单的、不可能的数学问题”)。记得将 input()的返回值用 int()函数转成一个整数,否则它会是一个字符串。

*答案将会单列一篇博文~~~~~~~~*

发布了37 篇原创文章 · 获赞 42 · 访问量 4527

猜你喜欢

转载自blog.csdn.net/qq_43337175/article/details/104166381