0x11 函数作为对象使用
- 下面的示例中要注意 a b作为参数的数据类型
>>> def multiply(x,y): ... return x * y ... >>> a = 4 >>> b = 7 >>> operation = multiply >>> print(operation(a,b)) 28
- 函数也可以作为其他函数的参数使用
>>> def add(x,y): ... return x + y ... >>> def do_twice(func,x,y): ... return func(func(x,y),func(x,y)) ... """ 本例中中的第二个函数功能作用是调用第一个参数(函数)得出小括号里面的x,y func(x,y)结果,再发结果继续传递给func作为参数 ... """ >>> a = 5 >>> b = 7 >>> print(do_twice(add,a,b)) 24
0x12 模块
- 模块是别人写好的功能块,最基本的使用方法是在代码的最顶部写入
import
modules_name
,访问模块内部的函数,变量使用.
,比如var是modules_name内部的一个函数。那么调用的时候表示为modules.var>>> import random >>> for i in range(5): ... value = random.randint(1,6) ... print(value) ... 2 4 5 5 6
- 上例中充分体现了使用模块 中的函数的方法用
.
虽然下例中也一样,但是需要注意的是 print函数的位置不一样,python是用>>> import random >>> for i in range(5): ... value = random.randint(1,6) ... >>> print(value) 5
- 引用模块中的单一函数。可以使用
from moudule_name import var
这样的方法>>> from math import pi >>> print(pi) 3.141592653589793
- 引用多个模块用
from moudule_name import var1,var2
>>> from math import pi >>> print(pi) 3.141592653589793 >>> from math import pi,sqrt >>> print(pi) 3.141592653589793 >>> sqrt(4) 2.0
- from math import * 加入math里面的所有模块这样是不好的,容易内外变量冲突
- import以后就可以直接用import时候的名字使用,如果没有import就会报未定义的错误
>>> pi Traceback (most recent call last): File "<stdin>", line 1, in <module> NameError: name 'pi' is not defined >>> sqrt Traceback (most recent call last): File "<stdin>", line 1, in <module> NameError: name 'sqrt' is not defined
- import 不存在的modules或拼写错误会报错
>>> import some_modules Traceback (most recent call last): File "<stdin>", line 1, in <module> ImportError: No module named 'some_modules'
- 重命名improt 的module from moudles
>>> from math import sqrt as square_root >>> print(square_root(100)) 10.0
- pyhton里面主要有3种模块,一种是自己写的,另一种是其他人写好的,直接安装的,最后一种是安装pyhton时候预安装的。最后一种,我们叫做标准库,常用的标准库有
string,re,datetime,math,random,os,multprocessing,subprocess,socket,email,json,doctest,unittest,pdb,argparse,sys
标准库能够完成,数据解析、数据排序、debug、大数据处理、电子邮件、命令行参数等。一些标准库使用C语言编写,一些使用python。 - 大部分通用与全平台,有一些是windows、unix特定的。
- 大部分的第三方模块在PyPI上面,最好的获取方式是使用pip在线安装。
pip install library_name
pip安装是最标准的方式比较通用于所有系统,也有一写是在windwos下编译好的,优先生成的图形化安装界面。
0x13 异常
- 出现异常的时候常会有对应的报错通过报错信息即可判断除当前的异常状态。常见的异常状态如下:
- ImportError an import fails
- IndexError a list id indexed with an out-of-range number
- NameError an unknows variable is used
- SyntaxError the code can’t be prased properly
- TypeError a fuction is called on a value of an inappropriate type
- ValueError a fuction is called on a value of the correct type,but with an inappropriate value
>>> num1 = 7 >>> num2 = 0 >>> print(num1/num2) Traceback (most recent call last): File "<stdin>", line 1, in <module> ZeroDivisionError: division by zero
>>> print("4" + 3) Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: Can't convert 'int' object to str implicitly
- 异常处理,使用try与except来处理异常。当try里面的代码发生异常时候,except里面买代码被执行。异常不发生,只执行try里面的。
- 异常处理在用户输入时候特别有用
- 下例中except 里面定义了错误类型与处理的方法
>>> try: ... num1 = 7 ... num2 = 0 ... print(num1 / num2) ... print("Done calculation") ... except ZeroDivisionError: ... print("An error occurred") ... print("due to zero division") ... An error occurred due to zero division
- 多个异常处理可以使用
()
来连接>>> try: ... variable = 10 ... print(variable + "hello") ... print(variable / 2) ... except ZeroDivisionError: ... print('Divided by zero') ... except(ValueError,TypeError): ... print('Error occurred') ... Error occurred
- except 不标识错误类型会识别所有错误类型,这要小心,识别的范围太广,代码将无法运行。
>>> try: ... word = "spam" ... print(word / 0) ... except: ... print("An error occurred" ) ... An error occurred
- finally 无乱如何都会运行的一个语句,写在 try/except 底部。
>>> try: ... print("Hello") ... print(1 / 0) ... except ZeroDivisionError: ... print('Divided by zero') ... finally: ... print("This code will run no mattwe what") ... Hello Divided by zero This code will run no mattwe what
- 前一个未捕获的异常也会触发finally(问题出在except那句的print没有
‘’
)>>> try: ... print("Hello") ... print(1 / 0) ... except ZeroDivisionError: ... print(Divided) ... finally: ... print("This code will run no mattwe what") ... Hello This code will run no mattwe what Traceback (most recent call last): File "<stdin>", line 3, in <module> ZeroDivisionError: division by zero During handling of the above exception, another exception occurred: Traceback (most recent call last): File "<stdin>", line 5, in <module> NameError: name 'Divided' is not defined
- raise可以引发异常
>>> raise ValueError Traceback (most recent call last): File "<stdin>", line 1, in <module> ValueError
>>> try: ... print(1 / 0) ... except ZeroDivisionError: ... raise ValueError ... Traceback (most recent call last): File "<stdin>", line 2, in <module> ZeroDivisionError: division by zero During handling of the above exception, another exception occurred: Traceback (most recent call last): File "<stdin>", line 4, in <module> ValueError
>>> name = 123 >>> raise NameError("invalid name!") Traceback (most recent call last): File "<stdin>", line 1, in <module> NameError: invalid name!
- raise可以用来重新引发异常
>>> try: ... num = 5 / 0 ... except: ... print("An error occurred") ... raise ... An error occurred Traceback (most recent call last): File "<stdin>", line 2, in <module> ZeroDivisionError: division by zero
- assert 断言;assert是一个严格判断条件,条件判断错误,引发异常。断言通过assert引发。
>>> print(1) 1 >>> assert 2 + 2 == 4 >>> print(2) 2 >>> assert 2 + 2 == 5 Traceback (most recent call last): File "<stdin>", line 1, in <module> AssertionError
- assert 断言可以接受第二个参数,但是需要注意断言引发的异常如果不处理将中止整个程序。
>>> temp = -10 >>> assert(temp >= 0),"Cloder than absolute zero!" Traceback (most recent call last): File "<stdin>", line 1, in <module> AssertionError: Cloder than absolute zero!
>>> temp = -10 >>> assert(temp <= 0),"Cloder than absolute zero!"
- 程序员常用的技巧是在函数开始的部分加入断言检查输入是否有效,然后在函数调用后检查是否有效输出