python学习之路(函数)

def 语句和参数


上面那个程序hello()函数定义中,name是变元,“变元”是一个变量。

注意:

    保存在变元中的值,在函数返回后就丢失了。例如前面的程序,如果你在 hello('Bob')之后添加 print(name),程序会报NameError,因为没有名为 name 的变量。在函数调用 hello('Bob')返回后,这个变量被销毁了,所以 print(name)会引用一个不存在的变量 name。

返回值和 return 语句

return 语句包含以下部分:

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

None 值

  • None 是 NoneType 数据类型的唯一值(其他编程语言可能称这个值为 null、nil 或 undefined)
  • 空值
  • 首字母大写

    在很多时候,对于所有没有 return 语句的函数定义,Python 都会在末尾加上 return None。这类似于 while 或 for 循环隐

式地以 continue 语句结尾。而且,如果使用不带值的 return 语句(也就是只有 return 关键字本身),那么就返回 None。

关键字参数和 print()

“关键字参数”是由函数调用时加在它们前面的关键字来识别的。关键字参数通常用于可选变元。print()函数有可选的变元 end 和 sep,分别指定在参数末尾打印什么,以及在参数之间打印什么来隔开它们。


局部和全局作用域

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

注意:

  • 局部变量不能在全局作用域内使用
  • 局部作用域不能使用其他局部作用域内的变量(要点在于,一个函数中的局部变量完全与其他函数中的局部变量分隔开来。)
  • 全局变量可以在局部作用域中读取
  • 名称相同的局部变量和全局变量

global 语句

有 4 条法则,来区分一个变量是处于局部作用域还是全局作用域:

  • 如果变量在全局作用域中使用(即在所有函数之外),它就总是全局变量。
  • 如果在一个函数中,有针对该变量的 global 语句,它就是全局变量。
  • 否则,如果该变量用于函数中的赋值语句,它就是局部变量。
  • 但是,如果该变量没有用在赋值语句中,它就是全局变量。

  


在一个函数中,如果试图在局部变量赋值之前就使用它,像下面的程序这样,Python就会报错   

发生这个错误是因为,Python 看到 spam()函数中有针对 eggs 的赋值语句,因此认为 eggs 变量是局部变量。但是因为 print(eggs)的执行在 eggs 赋值之前,局部变量 eggs 并不存在。Python 不会退回到使用全局 eggs 变量。

异常处理

下面的程序,它有一个“除数为零”的错误。


错误可以由 try 和 except 语句来处理。那些可能出错的语句被放在 try 子句中。如果错误发生,程序执行就转到接下来的 except 子句开始处。




print(spam(1))从未被执行是因为,一旦执行跳到 except 子句的代码,就不会回到try的子句中去。

一个小程序:猜数字

I am thinking of a number between 1 and 20.
Take a guess.
10
Your guess is too low.
Take a guess.
15
Your guess is too low.
Take a guess.
17
Your guess is too high.
Take a guess.
16
Good job! You guessed my number in 4 guesses!


小结

函数是将代码逻辑分组的主要方式。因为函数中的变量存在于它们自己的局部作用域内,所以一个函数中的代码不能直接影响其他函数中变量的值。这限制了哪些代码才能改变变量的值,对于调试代码是很有帮助的。

函数是很好的工具,帮助你组织代码。你可以认为他们是黑盒。它们以参数的形式接收输入,以返回值的形式产生输出。它们内部的代码不会影响其他函数中的变量。

在前面几章中,一个错误就可能导致程序崩溃。在本章中,你学习了 try 和 except语句,它们在检测到错误时会运行代码。这让程序在面对常见错误时更有灵活性。

练习

1.为什么在程序中加入函数会有好处?

答:函数减少了重复代码。这让程序更短,更容易阅读,更容易修改。

2.函数中的代码何时执行:在函数被定义时,还是在函数被调用时?

答:函数中的代码函数被调用时执行。

3.什么语句创建一个函数?

答:def语句

4.一个函数和一次函数调用有什么区别?

答: 函数是一个开头为def的语句,它包含函数名和函数体。如def guess()

        而函数之后的guess()是一次函数调用,只有当代码执行到guess()时,才会调用函数def guess()下面的函数体。

5.Python 程序中有多少全局作用域?有多少局部作用域?

答:在调用一个函数时,创建了一个全局作用域和一个局部作用域。

6.当函数调用返回时,局部作用域中的变量发生了什么?

答:当函数调用返回时,局部作用域中的变量被销毁。

7.什么是返回值?返回值可以作为表达式的一部分吗?

答:返回值时函数调用求值的结果。像所有值一样,返回值可以作为表达式的一部分。

8.如果函数没有返回语句,对它调用的返回值是什么?

答:None

9.如何强制函数中的一个变量指的是全局变量?

答:global语句强制函数中的一个变量引用该全局变量。

10.None 的数据类型是什么?

答:

11.import areallyourpetsnamederic 语句做了什么?

答:导入(areallyourpetsnamederic)模块

12.如果在名为 spam 的模块中,有一个名为 bacon()的函数,在引入 spam 后,如何调用它?

答:spam.bacon()

13.如何防止程序在遇到错误时崩溃?

答: try 

       except 

14.try 子句中发生了什么?except 子句中发生了什么?

答:如果try子句中的代码导致了一个错误,程序执行就立即转到except子句的代码。在运行那些代码之后,执行照常继续。


实践项目

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

这个程序的输出看起来应该像这样:
Enter number:
3
10
5
16
8
4
2

1



在下的程序如下:

输入验证

在前面的项目中添加 try 和 except 语句,检测用户是否输入了一个非整数的字符串。正常情况下,int()函数在传入一个非整数字符串时,会产生 ValueError 错误,比如 int('puppy')。在 except 子句中,向用户输出一条信息,告诉他们必须输入一个整数。


  • 3
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值