笔记|《简明Python教程》:编程小白的第一本python入门书
《简明Python教程》这本书是初级的Python入门教材,初级内容基本覆盖,对高级内容没有做深入纠结。适合刚接触Python的新手,行文比较简洁轻松,读起来也比较顺畅。
下面是我根据各个章节的内容进行的简要归纳,相关代码都已按照章节顺序进行命名。
基本介绍
- Python特点:
简单、易学、免费、开源、可移植性好、面向对象、可扩展、丰富的库等等。
如果你需要你的一段关键代码运行得更快或者希望某些算法不公开,你可以把你的部分程序用C或C++编写,然后在你的Python程序中使用它们。C,C++为编译型语言,变异后看不到源代码。
- 编辑器的选择:
强烈建议你学习使用VIM或Emacs,从长远看来它们对你是极其有帮助的。 - 如何退出Python提示符:
如果你使用的是Linux/BSD shell,那么按Ctrl-d退出提示符。
如果是在Windows命令行中,则按Ctrl-z再按Enter。
基本概念
-
'#'符号右面的内容都是注释
-
特殊形式的注释:
源文件的头两个字符是#!,后面跟着一个程序,告诉你的Linux/Unix系统执行你的程序的时候,它应该运行哪个解释器。 -
可执行的Python程序:
在linux下,chmod命令用来改变文件的模式 ,给系统中所有用户这个源文件的执行许可。然后直接通过指定源文件的位置来执行程序。我们使用./来指示程序位于当前目录。$ chmod a+x helloworld.py $ ./helloworld.py Hello World
-
设置环境变量的作用:
能让程序在各个位置运行。运行时,系统会查找列在PATH环境变量中的各个目录,然后运行那个程序。 -
显示PATH变量
$ echo $PATH
-
获取帮助
运行help(str)——这会显示str类的帮助。str类用于保存你的程序使用的各种文本(字符串),按q退出帮助。 -
三引号
使用三引号('''或""")利用三引号,你可以指示一个多行的字符串。你可以在三引号中自由的使用单引号和双引号。 -
特殊字符
\'来指示单引号 \\来指示反斜杠 行末的单独 \ 表示字符串在下一行继续 不需转义: 字符串加上前缀r或R来指定
-
字符串是不可变对象
这意味着一旦你创造了一个字符串,你就不能再改变它了。 -
标识符的命名
标识符的第一个字符必须是字母表中的字母(大写或小写)或者一个下划线(‘_’)。 标识符名称的其他部分可以由字母(大写或小写)、下划线(‘ _ ’)或数字组成。 标识符名称是对大小写敏感的。例如,myname和myName不是一个标识符。 有效 标识符名称的例子有i、__my_name、name_23和a1b2_c3。 无效 标识符名称的例子有2things、this is spaced out和my-name。
-
逻辑行与物理行
建议你坚持在每个物理行只写一句逻辑行。仅仅当逻辑行太长的时候,在多于一个物理行写一个逻辑行。这些都是为了尽可能避免使用分号,从而让代码更加易读。 -
如何缩进
不要混合使用制表符和空格来缩进,因为这在跨越不同的平台的时候,无法正常工作。我强烈建议你在每个缩进层次使用单个制表符或两个或四个空格。
运算符和表达式
严格来说,逻辑操作符的操作数应该为布尔表达式,但Python对此处理的比较灵活,即使操作数是数字,解释器也把他们当成“表达式”。
非0的数字的布尔值为1,0的布尔值是0。空字符串为假,非空字符串为真。非零的数为真。
-
and操作符:
只要左边的表达式为真,整个表达式返回的值是右边表达式的值。否则,返回左边表达式的值。 -
or操作符:
只要两边的表达式都为真,整个表达式的结果是左边表达式的值;如果是一真一假,返回真值表达式的值。特别注意的是空值和0的情况,这时候返回的是右边的0或空值.
Python中代表False的值有:
- 布尔型,False表示False,其他为True (false则不同)
- 整数和浮点数,0表示False,其他为True
- 字符串和类字符串类型(包括bytes和unicode),空字符串表示False,其他为True(注:'0'字符串零并不是False)
- 序列类型(包括tuple,list,dict,set等),空表示False,非空表示True
- None永远表示False
>>> print '' or 5 or 0
5
>>> print 5 and 4
4
位运算:
左移: 3<<1
0001(十进制1)
<< 3(左移3位)
= 1000(十进制8)
右移: 10>>2
1010(十进制10)
>> 2(右移2位)
= 0010(十进制2)
位与: 5&3
0101(十进制5)
AND 0011(十进制3)
= 0001(十进制1)
位或: 5|3
0101(十进制5)
OR 0011(十进制3)
= 0111(十进制7)
位异或: 2^10
0010(十进制2)
XOR 1010 (十进制10)
= 1000 (十进制8)
运算符优先级:
运算符 描述
** 指数 (最高优先级)
~ + - 按位翻转, 一元加号和减号 (最后两个的方法名为 +@ 和 -@)
* / % // 乘,除,取模和取整除
+ - 加法减法
>> << 右移,左移运算符
& 位 'AND'
^ | 位运算符
<= < > >= 比较运算符
<> == != 等于运算符
= %= /= //= -= += *= **= 赋值运算符
is is not 身份运算符
in not in 成员运算符
not or and 逻辑运算符
控制流
- 在Python中有三种控制流语句——if、for和while。
- break VS continue
break语句是用来终止循环语句的,即哪怕循环条件没有称为False或序列还没有被完全递归,也停止执行循环语句。
continue语句被用来告诉Python跳过当前循环块中的剩余语句,然后继续进行下一轮循环。
注:如果你从for或while循环中终止,任何对应的循环else块将不执行。
函数
- 形参与实参
参数在函数定义的圆括号对内指定,用逗号分割。当我们调用函数的时候,我们以同样的方式提供值。函数中的参数名称为形参,提供给函数调用的值称为实参。 - 局部变量
当你在函数定义内声明变量的时候,它们与函数外具有相同名称的其他变量没有任何关系,即变量名称对于函数来说是局部的。所有变量的作用域是它们被定义的块,从它们的名称被定义的那点开始。 - global语句
如果你想要为一个定义在函数外的变量赋值,那么你就得告诉Python这个变量名不是局部的,而是全局的,使用global语句完成这一功能。没有global语句,是不可能为定义在函数外的变量赋值的。 - 使用默认参数值
只有在形参表末尾的那些参数可以有默认参数值,即你不能在声明函数形参的时候,先声明有默认值的形参而后声明没有默认值的形参。
赋给形参的值是根据位置而赋值的。例如,def func(a, b=5)是有效的,但是def func(a=5, b)是无效的。 - 关键参数
如果你的某个函数有许多参数,而你只想指定其中的一部分,那么你可以通过命名来为这些参数赋值——这被称作关键参数——我们使用名字(关键字)而不是位置(我们前面所一直使用的方法)来给函数指定实参。如: func(c=50, a=100) - return语句
return语句用来从一个函数返回即跳出函数,从函数返回一个值 。 - DocStrings
Python有一个很奇妙的特性,称为文档字符串,它通常被简称为docstrings。它帮助你的程序文档更加简单易懂,你应该尽量使用它。
文档字符串的惯例是一个多行字符串,它的首行以大写字母开始,句号结尾。第二行是空行,从第三行开始是详细的描述。
如果你已经在Python中使用过help(),那么你已经看到过DocStings的使用了!它所做的只是抓取函数的__doc__属性,然后整洁地展示给你。
模块
- os.name字符串指示你正在使用的平台。比如对于Windows,它是'nt',而对于Linux/Unix用户,它是'posix'。
- os.getcwd()函数得到当前工作目录,即当前Python脚本工作的目录路径。
- os.getenv()和os.putenv()函数分别用来读取和设置环境变量。
- os.listdir()返回指定目录下的所有文件和目录名。
- os.remove()函数用来删除一个文件。
- os.system()函数用来运行shell命令。
- os.linesep字符串给出当前平台使用的行终止符。例如,Windows使用'\r\n',Linux使用'\n'而Mac使用'\r'。
- os.path.split()函数返回一个路径的目录名和文件名。
>>> os.path.split('/home/swaroop/byte/code/poem.txt')
('/home/swaroop/byte/code', 'poem.txt')
-
os.path.isfile()
检验给出的路径是否是文件 -
os.path.isdir()
检验给出的路径是否是目录。 -
os.path.exists()
检验给出的路径是否真地存在。 -
from..import语句
如果你想要输入所有sys模块使用的名字,那么你可以使用from sys import *语句。(避免使用) -
模块的__name__
每个模块都有一个名称,在模块中可以通过语句来找出模块的名称。这在一个场合特别有用——就如前面所提到的,当一个模块被第一次输入的时候,这个模块的主块将被运行。 -
dir()函数
你可以使用内建的dir函数来列出模块定义的标识符。标识符有函数、类和变量。当你为dir()提供一个模块名的时候,它返回模块定义的名称列表。如果不提供参数,它返回当前模块中定义的名称列表。 -
del
这个语句在运行后被用来删除一个变量/名称。在例子del a中,你将无法再使用变量a——它就好像从来没有存在过一样。
数据结构
- 字符串
split函数的另外一个参数是规定作为分隔符的字符串。分隔符不显示在列表中。
>>> string.split(song, 'ai')
['The r', 'n in Sp', 'n...']
函数jion的功能和split正好相反,它是将列表连接成字符串。默认的分
隔符是空格。
>>> list = ['The', 'rain', 'in', 'Spain...']
>>> string.join(list)
'The rain in Spain...'
-
列表:
len(list)、list.append、list.sort、del list[0] -
元组:
元组和字符串一样是不可变的,即你不能修改元组。元组通过圆括号中用逗号分割的项目定义。 -
字典:
它们的键/值对用冒号分割,而各个对用逗号分割,所有这些都包括在花括号中。
赋值:d[key]= value
删除:del d[key]
迭代出每一项:for name,address in ab.items() -
序列:列表、元组、字符串都属于序列。
序列的两个特点:索引操作符和切片操作符。 -
引用:
当你创建一个对象并给它赋一个变量的时候,这个变量仅仅 引用 那个对象,而不是表示这个对象本身! -
字符串方法:
in操作符用来检验一个给定字符串是否为另一个字符串的一部分。 -
find方法:
用来找出给定字符串在另一个字符串中的位置,或者返回-1以表示找不到子字符串。 -
append:
在列表的尾部追加元素,参数是插入元素的值。方法extend合并两个列表为一个。
面向对象编程
self:类的方法与普通的函数只有一个特别的区别——它们必须有一个额外的第一个参数名称,但是在调用这个方法的时候你不为这个参数赋值,Python会提供这个值。这个特别的变量指对象本身,按照惯例它的名称是self。
__init__方法: __init__方法在类的一个对象被建立时,马上运行。这个方法可以用来对你的对象做一些你希望的初始化 。
类与对象的方法:类的变量 由一个类的所有对象(实例)共享使用。对象的变量 由类的每个对象/实例拥有。
继承:基本类的__init__方法专门使用self变量调用。
-
类与对象
类使用class关键字创建。类的域和方法被列在一个缩进块中。 -
self
类的方法与普通的函数只有一个特别的区别——它们必须有一个额外的第一个参数名称,但是在调用这个方法的时候你不为这个参数赋值,
Python会提供这个值。这个特别的变量指对象本身,按照惯例它的名称是self。 -
类的使用
我们使用class语句后跟类名,创建了一个新的类。这后面跟着一个缩进的语句块形成类体。
在这个例子中,我们使用了一个空白块,它由pass语句表示。接下来,我们使用类名后跟一对圆括号来创建一个对象/实例(实例化)。 -
__init__
方法
__init__
方法在类的一个对象被建立时,马上运行。这个方法可以用来对你的对象做一些你希望的初始化 。
注意,这个名称的开始和结尾都是双下划线。 -
__del__
方法
__del__
它在对象消逝的时候被调用。对象消逝即对象不再被使用,它所占用的内存将返回给系统作它用。
输入输出
模式可以为读模式'r'、写模式'w'或追加模式'a'。
使用file类的write方法来写文件,最后我们用close关闭这个文件。
使用readline方法读文件的每一行。
异常
-
处理异常
我们可以使用try..except语句来处理异常。我们把通常的语句放在try-块中,而把我们的错误处理语句放在except-块中。 -
引发异常
你可以使用raise语句 引发 异常。你还得指明错误/异常的名称和伴随异常 触发的 异常对象。
你可以引发的错误或异常应该分别是一个Error或Exception类的直接或间接导出类。 -
try...finally
异常发生后有语句仍然执行。
python标准库
- sys模块
sys模块包含了与Python解释器和它的环境有关的函数。
sys.argv变量是一个字符串的列表。特别地,sys.argv包含了命令行参数 的列表,即使用命令行传递给你的程序的参数。 如:sys.argv[0]、sys.argv[1]
.pyc文件: 字节编译的文件 ,这些文件以.pyc作为扩展名。
from..import语句: from sys import argv语句。
模块的__name__:获取模块的名称。__main__为当前程序。
制造你自己的模块:记住这个模块应该被放置在我们输入它的程序的同一个目录中,或者在sys.path所列目录之一。
dir():内建的dir函数来列出模块定义的标识符。标识符有函数、类和变量。
更多python内容
表生成式、单语句块、lambda语句
exec语句用来执行储存在字符串或文件中的Python语句
>>> exec 'print "Hello World"
eval语句用来计算存储在字符串中的有效Python表达式。
>>> eval('2*3')
assert语句用来声明某个条件是真的。当assert语句失败的时候,会引发一个AssertionError。
- assert语句
assert语句用来声明某个条件是真的。
例如,如果你非常确信某个你使用的列表中至少有一个元素,而你想要检验这一点,并且在它非真的时候引发一个错误,那么assert语句是应用在这种情形下的理想语句。当assert语句失败的时候,会引发一个AssertionError。
书中的代码都整理在github上了.详见:https://github.com/Everfighting/A-Byte-of-Python.git