结合菜鸟教程,对知识点进行查漏补缺。总结中的代码均为菜鸟教程上的源代码(菜鸟教程的网址:https://www.runoob.com/python3/python3-tutorial.html)。现将第二部分的内容总结如下:
11. 编程第一步
对于表达式:a, b=b, a+b,它的执行顺序为:
m=b
n=a+b
a=m
b=n
即按照从左至右的顺序来执行。
end:使得print()的输出不在一行上,还可以在输出的末尾添加一定的字符。如:
a, b = 0, 1
while b < 1000:
print(b, end=',')
a, b = b, a+b
结果是:
1,1,2,3,5,8,13,21,34,55,89,144,233,377,610,987,
12. 语句
条件语句:支持嵌套。
循环语句:也可以使用else。例如:
(1)while循环
#!/usr/bin/python3
count = 0
while count < 5:
print (count, " 小于 5")
count = count + 1
else:
print (count, " 大于或等于 5") #不满足循环条件时,跳到else语句继续执行
类似于for循环,也可以将while与循环体写在同一行。
(2)for循环
for <variable> in <sequence>:
<statements>
else:
<statements>
如上(2),若在for循环中有了break,则跳出循环时,对应的循环的else语句不执行。
13. 迭代器与生成器
迭代器:从集合的第一个元素开始访问,直到所有的元素都被访问了为止。迭代器只能往前而不能往后。
基本方法:iter()和next()。
实例:
>>> list=[1,2,3,4]
>>> it = iter(list) # 创建迭代器对象
>>> print (next(it)) # 输出迭代器的下一个元素
1
>>> print (next(it))
2
迭代器对象也可以用for进行遍历,有:
#!/usr/bin/python3
list=[1,2,3,4]
it = iter(list) # 创建迭代器对象
for x in it:
print (x, end=" ")
(1)类与迭代器
要用到两个特殊的方法:_iter_()和_next_()。
Python 的构造函数为 __init__(), 它会在对象初始化的时候执行。
具体实例见:https://www.runoob.com/python3/python3-iterator-generator.html。
(2)生成器
是一个使用yield的函数,返回迭代器。
每次遇到yield时函数会暂停执行并保存当前所有的运行信息,返回yield的值,在下次执行next()方法时会从当前位置继续运行。
14. 函数
a=[1, 2, 3]
a=”Runoob”
在Python中,变量a是没有类型的,它仅是对象的引用(一个指针),可以指向List类的对象,也可以指向String对象。
不可变对象:immutable,可变对象:mutable。
参数:必须参数、默认参数、不定长参数和之前廖雪峰老师在Python教程中的介绍一致。对于关键字参数,在廖老师的教程中未有介绍,而且对于带有**和以*隔开的参数的名称叫法和这里也不同(廖老师的教程中将这两种情况的参数称为关键字参数和命名关键字参数,在菜鸟教程中并未起名字)。菜鸟教程中的关键字参数的实例如下所示:
#!/usr/bin/python3
#可写函数说明
def printme( str ):
"打印任何传入的字符串"
print (str)
return
#调用printme函数
printme( str = "菜鸟教程")
结果是:
菜鸟教程
关键字参数:参数应该有参数名和数值。
匿名函数:lambda 参数1, 参数2, ... : 表达式
变量作用域:
Python中的作用于一共有四种,即局部作用域(Local,L)、闭包外的函数中(Enclosing,E),全局作用域(Global,G),内置作用域(Built-in,B,内置函数所在的模块的范围)。作用域的范围由小至大依次为:L—>E—>G—>B。
g_count = 0 # 全局作用域
def outer():
o_count = 1 # 闭包函数外的函数中
def inner():
i_count = 2 # 局部作用域
全局变量global和nonlocal关键字:
1)global:
#!/usr/bin/python3
num = 1
def fun1():
global num # 需要使用 global 关键字声明
print(num)
num = 123
print(num)
fun1()
print(num)
结果是:1
123
123
2)nonlocal:修改enclosing作用域的变量用nonlocal
#!/usr/bin/python3
def outer():
num = 10
def inner():
nonlocal num # nonlocal关键字声明
num = 100
print(num)
inner()
print(num)
outer()
结果是:100
100
15. 数据结构
列表:可以当做栈(利用.append(),.pop()来实现增删元素)。
也可以当做队列,但是效率不高(因为增删元素需要移动原来的每一个元素)。
元组:
>>> t = 12345, 54321, 'hello!'
>>> t[0]
12345
>>> t
(12345, 54321, 'hello!')
>>> # Tuples may be nested:
... u = t, (1, 2, 3, 4, 5)
>>> u
((12345, 54321, 'hello!'), (1, 2, 3, 4, 5))
输入没有()时,输出依然是有()的。
集合:同之前对集合部分的介绍,无额外补充的内容。
字典:和之前的介绍中的内容一致,没有需要额外补充的内容。
例子:嵌套列表的实现
实现下列的矩阵:
>>> matrix = [
... [1, 2, 3, 4],
... [5, 6, 7, 8],
... [9, 10, 11, 12],
... ]
方式一:
>>> [[row[i] for row in matrix] for i in range(4)]
[[1, 5, 9], [2, 6, 10], [3, 7, 11], [4, 8, 12]]
方式二:
>>> transposed = []
>>> for i in range(4):
... transposed.append([row[i] for row in matrix])
...
>>> transposed
[[1, 5, 9], [2, 6, 10], [3, 7, 11], [4, 8, 12]]
方式三:
>>> transposed = []
>>> for i in range(4):
... # the following 3 lines implement the nested listcomp
... transposed_row = []
... for row in matrix:
... transposed_row.append(row[i])
... transposed.append(transposed_row)
...
>>> transposed
[[1, 5, 9], [2, 6, 10], [3, 7, 11], [4, 8, 12]]
16. 模块
获得命令行参数:使用sys模块。例子:
import sys
print('命令行参数如下:')
for i in sys.argv:
print(i)
print('\n\nPython 路径为:', sys.path, '\n') #Python解释器查找模块所在的路径
查找当前模块下所有方法
内置的函数dir()可以找到模块内定义的所有名称,以一个字符串列表的形式返回。
>>> import fibo, sys
>>> dir(fibo)
['__name__', 'fib', 'fib2']
包与模块:
目录只有包含一个叫做 __init__.py 的文件才会被认作是一个包。
17. 输入和输出
输出可以采用:print()
sys.stdout
可以格式化输出:%
str.format()
将输出的值转换为字符串:str() 返回一个用户易读的表达形式
repr() 返回一个解释器易读的表达形式。
输入:input()
读写文件:和廖雪峰老师这部分的介绍是一样的。
补充:readline:从文件中读取单独的一行,f.readline()如果返回一个空字符串,则说明已读到最后一行。readlines:返回该文件中包含的所有行。例子:
#!/usr/bin/python3
# 打开一个文件
f = open("/tmp/foo.txt", "r")
str = f.readlines()
print(str)
# 关闭打开的文件
f.close()
输出结果是:
['Python 是一个非常好的语言。\n', '是的,的确非常好!!\n']
Python的pickle:和廖老师介绍的不太一样,还需要再思考思考。
python的pickle模块实现了基本的数据序列和反序列化。
通过pickle模块的序列化操作我们能够将程序中运行的对象信息保存到文件中去,永久存储。
通过pickle模块的反序列化操作,我们能够从文件中创建上一次程序保存的对象。
18. File
r,r+,rb,rb+;
w,w+,wb,wb+;
a,a+,ab,ab+。
19. OS
OS模块。处理文件和目录。
之前用到的os.path(),可以获得文件的属性信息。
20. 错误和异常
常见的错误:语法错误,异常。
异常指的是没有语法错误,但是在运行的时候可能发生错误。出现异常时,会以错误信息的形式展现在最后的结果中。
补充:else也可以用在异常处理中。
for arg in sys.argv[1:]:
try:
f = open(arg, 'r')
except IOError:
print('cannot open', arg)
else:
print(arg, 'has', len(f.readlines()), 'lines')
f.close()
21. 面向对象
大部分内容和廖雪峰老师在Python教程中描述的内容是一致的。这里进行了一些补充,如下所示:
定义类的专有方法:见https://www.runoob.com/python3/python3-class.html中的方法列举。可以使用类的专有方法实现运算符重载。例子如下所示:
#!/usr/bin/python3
class Vector:
def __init__(self, a, b):
self.a = a
self.b = b
def __str__(self):
return 'Vector (%d, %d)' % (self.a, self.b)
def __add__(self,other):
return Vector(self.a + other.a, self.b + other.b)
v1 = Vector(2,10)
v2 = Vector(5,-2)
print (v1 + v2)
结果是:Vector(7,8)。
22. 标准库
内置的标准库,有兴趣可以看下。网址:https://www.runoob.com/
python3/python3-stdlib.html。