1. 基础知识
[TOC]
1.1. 参数
主要有2种参数:
- 位置参数
- 关键字参数:类似键值对。
在函数调用中,关键字参数必须跟随在位置参数的后面。
调用函数时可使用的正式参数类型:
- 必备参数:必备参数须以正确的顺序传入函数。
- 关键字参数:类似于键值对,允许函数调用时参数的顺序与声明时不一致。
- 默认参数:默认参数的值如果没有传入,则被认为是默认值
- 不定长参数:前面加个*
当存在一个形式为 **kwargs
的正式形参时,它会接收一个字典,其中包含除了与正式形参相对应的关键字参数以外的所有关键字参数。
一个形式为 *args
,接收一个包含除了正式形参列表以外的位置参数的元组。
1.2. 循环的技巧
遍历字典,用 items()
方法可将关键字和对应的值同时取出。
遍历列表,用 enumerate()
函数可以将索引位置和其对应的值同时取出。
如果要按某个指定顺序循环一个序列,可以用 sorted()
函数,它可以在不改动原序列的基础上返回一个新的排列。
当同时在两个或更多序列中循环时,可以用 zip()
函数将其内元素一一匹配。
questions = ['name', 'quest', 'favorite color']
answers = ['lancelot', 'the holy grail', 'blue']
for q, a in zip(questions, answers):
print('What is your {0}? It is {1}.'.format(q, a))
当逆向循环一个序列时,先正向定位序列,然后调用 reversed()
函数
for i in reversed(range(5)):
print(i)
1.3. 字符串的format方法
格式如下:
{ <参数序号>:<格式控制标记> }
格式控制标记:
: | <填充> | <对齐> | <宽度> | , | <.精度> | <类型> |
---|---|---|---|---|---|---|
填充的单个字符 | <:左对齐 >:右对齐 ^:居中对齐 |
设置输出宽度 | 数字的千分位分隔符 | 浮点数的精度 | 整数:b/c/d/o/x/X 浮点数:e/E/f/% |
1.4. python 变量
变量命名规则:
- 以单下划线开头 _foo的代表不能直接访问的类属性,需通过类提供的接口进行访问,不能用
from xxx import *
导入。 - 以双下划线开头的 foo 代表类的私有成员。
- 以双下划线开头和结尾的 _foo 代表 Python 里特殊方法专用的标识,如 init_() 代表类的构造函数。
Python有五个标准的数据类型:
- Numbers(数字):是不可改变的数据类型,这意味着改变数字数据类型会分配一个新的对象。数据类型是不允许改变的,这就意味着如果改变 Number 数据类型的值,将重新分配内存空间。
- String(字符串)
- List(列表): 是 Python 中使用最频繁的数据类型。
- Tuple(元组):元组不能二次赋值,相当于只读列表。
- Dictionary(字典):最灵活的内置数据结构类型。列表是有序的对象集合,字典是无序的对象集合。
Python支持四种不同的数字类型:
- int(有符号整型)
- long(长整型[也可以代表八进制和十六进制]): 32L,231l
- float(浮点型)
- complex(复数): a+bj, complex(a,b) 。复数的实部 a 和虚部 b 都是浮点型。
注意:long 类型只存在于 Python2.X 版本中,在 2.2 以后的版本中,int 类型数据溢出后会自动转为long类型。在 Python3.X 版本中 long 类型被移除,使用 int 替代。
Python 可以同一行显示多条语句,方法是用分号 ; 分开。
Python语句中一般以新行作为语句的结束符。但是我们可以使用斜杠( \)将一行的语句分为多行显示,如下所示:
total = item_one + \
item_two + \
item_three
语句中包含 [], {} 或 () 括号就不需要使用多行连接符。如下实例:
days = ['Monday', 'Tuesday', 'Wednesday',
'Thursday', 'Friday']
Python 可以使用引号( ' )、双引号( " )、三引号( ''' 或 """ ) 来表示字符串。
其中三引号可以由多行组成,编写多行文本的快捷语法,常用于文档字符串。在文件的特定地点,可以被当做注释。
Python允许你同时为多个变量赋值。例如:
a = b = c = 1
以上实例,创建一个整型对象,值为1,三个变量被分配到相同的内存空间上。
您也可以为多个对象指定多个变量。例如:
a, b, c = 1, 2, "hello"
以上实例,两个整型对象 1 和 2 分别分配给变量 a 和 b,字符串对象 "hello" 分配给变量 c。
可以使用del语句删除一些对象的引用。
del var1[,var2[,var3[....,varN]]]]
加号(+)是字符串连接运算符,星号(*)是重复操作。
str * 2 # 输出字符串两次
str + "TEST" # 输出连接的字符串
列表的操作和字符串类似。
1.5. 变量详解
每个变量在内存中创建,都包括变量的标识,名称和数据这些信息。
每个变量在使用前都必须赋值,变量赋值以后该变量才会被创建。
等号(=)运算符左边是一个变量名,右边是存储在变量中的值。
变量是存储在内存中的值。这就意味着在创建变量时会在内存中开辟一个空间。
基于变量的数据类型,解释器会分配指定内存,并决定什么数据可以被存储在内存中。因此,变量可以指定不同的数据类型,这些变量可以存储整数,小数或字符。
字典:键必须不可变,所以可以用数字,字符串或元组充当,所以用列表就不行。
在 python 中,strings, tuples, 和 numbers 是不可更改的对象,而 list,dict 等则是可以修改的对象。
对象类型:
- 不可变类型:变量赋值 a=5 后再赋值 a=10,这里实际是新生成一个 int 值对象 10,再让 a 指向它,而 5 被丢弃,不是改变a的值,相当于新生成了a。
- 可变类型:变量赋值 la=[1,2,3,4] 后再赋值 la[2]=5 则是将 list la 的第三个元素值更改,本身la没有动,只是其内部的一部分值被修改了。
python 函数的参数传递:
- 不可变类型:类似 c++ 的值传递,如 整数、字符串、元组。如fun(a),传递的只是a的值,没有影响a对象本身。比如在 fun(a)内部修改 a 的值,只是修改另一个复制的对象,不会影响 a 本身。
- 可变类型:类似 c++ 的引用传递,如 列表,字典。如 fun(la),则是将 la 真正的传过去,修改后fun外部的la也会受影响
python 中一切都是对象,严格意义我们不能说值传递还是引用传递,我们应该说传不可变对象和传可变对象。
如果一个局部变量和一个全局变量重名,则局部变量会覆盖全局变量。如果要给函数内的全局变量赋值,必须使用 global 语句。
1.6. 常用运算符
- 算术运算符:加(+)、减(-)、乘()、除(/)、取余(%)、幂(*)、整除(//)。
位运算符:&,|,^(异或),~(取反),<<,>>
逻辑运算符:and,or,not
成员运算符:in,not in
注: id()
函数用于获取对象内存地址。
is 与 == 区别:
is 用于判断两个变量引用对象是否为同一个(同一块内存空间), == 用于判断引用变量的值是否相等。
1.7. 控制语句
在 python 中,while … else 在循环条件为 false 时执行 else 语句块:
for … else 表示这样的意思,for 中的语句和普通的没有区别,else 中的语句会在循环正常执行完(即 for 不是通过 break 跳出而中断的)的情况下执行,while … else 也是一样。
1.8. 内置函数
dir()返回的列表容纳了在一个模块里定义的所有模块,变量和函数。
显示所有内置函数/变量/类:
import builtins
print(dir(builtins))
根据调用地方的不同,globals() 和 locals() 函数可被用来返回全局和局部命名空间里的名字。
如果在函数内部调用 locals(),返回的是所有能在该函数里访问的命名。
如果在函数内部调用 globals(),返回的是所有在该函数里能访问的全局名字。
1.9. python模块与包
Python 模块(Module),是一个 Python 文件,以 .py 结尾。模块能定义函数,类和变量,模块里也能包含可执行的代码。
包是一个分层次的文件目录结构,它定义了一个由模块及子包,和子包下的子包等组成的 Python 的应用环境。
简单来说,包就是文件夹,但该文件夹下必须存在 __init__.py
文件(内容可以为空)。__init__.py
用于标识当前文件夹是一个包。
当一个模块被导入到一个脚本,模块顶层部分的代码只会被执行一次。因此,如果你想重新执行模块里顶层部分的代码,可以用 reload() 函数
import importlib
importlib.reload(module_name)
当解释器遇到 import 语句,如果模块在当前的搜索路径中,就会被导入。
搜索路径是一个解释器会先进行搜索的所有目录的列表。
当你导入一个模块,Python 解析器对模块位置的搜索顺序是:
- 具有该名称的内置模块
- 当前目录
- 如果不在当前目录,Python 则搜索在 shell 变量 PYTHONPATH 下的每个目录。
- 如果都找不到,Python会察看默认路径。UNIX下,默认路径一般为/usr/local/lib/python/。
模块搜索路径存储在 system 模块的 sys.path
变量中。变量里包含当前目录,PYTHONPATH和由安装过程决定的默认目录。
当导入一个包时,搜索顺序 和导入模块差不多,但是没有步骤1(最先搜索内置模块)。
如以下代码所示:
html/
parser.py
html/
__init__.py
parser.py
main.py
# main.py
from html import parser
# other code
第1个是html是模块(没有定义 __init__.py
),第2个是包。当使用模块时,main.py中导入parser会先到内置模块中寻找,而正好有个同名的内置模块html,最终导致导入的是内置模块html,而不是自己编写的。 如果使用第二种写法,则导入的是自己写的html.parser。
1.10. python异常
BaseException | 所有异常的基类 |
---|---|
Exception | 常规错误的基类 |
raise语法格式如下:
# raise [Exception [, args [, traceback]]]
# 定义函数
def mye( level ):
if level < 1:
raise Exception,"Invalid level!"
try:
mye(0) # 触发异常
except Exception,err:
print 1,err
else:
print 2
1.11. 类
class ClassName:
'类的帮助信息' #类文档字符串
class_suite #类体
类的帮助信息可以通过ClassName.doc查看。
class_suite 由类成员,方法,数据属性组成。
Python内置类属性:
- dict : 类的属性(包含一个字典,由类的数据属性组成)
- doc :类的文档字符串
- name: 类名
- module: 类定义所在的模块(类的全名是'main.className',如果类位于一个导入模块mymod中,那么className.module 等于 mymod)
- bases : 类的所有父类构成元素(包含了一个由所有父类组成的元组)
Python 使用了引用计数这一简单技术来跟踪和回收垃圾。在 Python 内部记录着所有使用中的对象各有多少引用。