/A-Byte-of-Python

A Byte of Python 书中代码和笔记

Primary LanguagePython

《简明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