1. 文件开头的写法
- Python和普通的脚本程序一样,开头必须说明解释器的种类,尤其在Linux中,必须指明解释器的位置,通常的写法是:
#!/bin/usr/python3
#!/bin/usr/env python3
其中env
指的是环境变量,chmod +x 文件名
给予文件执行权限。
- Python开头也应该指明源文件的编码类型,默认也是UTF-8。
# -*- coding: encoding -*-
2. 内存管理
Python不需要程序员进行内存管理,解释器会自动负责。
3. 解释型和编译性
Python是解释性语言,但也可以被编译成类似字节码的形式来加快运行速度。
4. Python编译指令
python -d
提供调试输出
python -O
生成优化的字节码(生成.pyo文件)
python -S
不导入site模块以在启动时查找Python的路径
python -m mod
将一个模块以脚本形式运行
python file
从给定的文件运行Python脚本
5. Python的不同版本
- Python的C实现叫CPython
- Python的Java实现叫Jython:只要有Java虚拟机,就可以运行Jython,它拥有访问Java包和类库的能力,利用的是Java原生的垃圾收集器(CPython未实现此功能)。
6. Python函数
- 未指定返回值的函数自动返回None,等价于NULL。
7. 交互模式下编程
>>>
主提示符,开始指令的输入
...
从属提示符,换行后继续下一个指令的输入
当输入一个空行后,按回车键表示多行输入结束。
8. 数值的计算
- /永远会返回一个浮点数,需要整除要用//,需要乘方要用**,一个计算式中只要有浮点数结果就会用浮点数表示。
- 最近一个表达式的值会赋给下划线符号
_
,且它是只读的。 - 支持复数,用j或J表示,例如
3+5j
。
9. 字符串的使用
- 单引号和双引号作用一样,不区分
- 要在引号中使用反斜杠本身而不是转义作用时,要用
\\
双反斜杠,或者在第一个引号前面加小写r。 - 使用三引号(不区分单双)可在多行编辑字符串,后接反斜杠表示下一行的开头接着本行末尾,也即没有换行符号。
print('''\
This is first line
this is second line
this is third line
''')
- 可用 + 连接两个字符串,用 * 表示字符串的重复。
print(3 * 'AB')
'ABABAB'
- 相邻的字符串文本会自动连接到一起,但仅限于字符串文本,表达式不行。
'py' 'thon'
'python'
- Python没有字符类型,字符就是最简单的字符串。字符串可以被索引,被切片。
word = python
word[0]
'p'
word[-1]
'n'
word[0,2] #包括起始字符,不包含末尾字符
'py'
word[:2] + word[2:] #永远等于word
'python'
#开头省略的索引默认为0,结尾省略的默认为字符串大小(个数)
len()
返回字符串的长度
10. 循环体的判断条件
- 所有非零整数都是true,0为false。若是序列则非空为true,空则为false。
11. for循环迭代
- 在循环迭代过程中修改迭代的序列是不安全的,可以迭代它的复本,然后修改原序列。
words = ['cat','dog','pig']
for animal in words[:]: #words[:]是复本
if len(animal) > 2:
words.insert(0, animal) #这里的words是原序列变量
range(start, end, step)
:起始值,结束值(不包括),步进值。- for函数:迭代器;range函数:可迭代的;list函数:迭代器;
- for循环后可以有一个else语句,表示本次循环正常结束(没有被break)时执行。
12. print函数
- 默认是自动换行的,使用
print(var, end='')
可以规定输出以什么结尾。
13. 函数的定义
- 结构
def fib(n): #函数名
"""打印一个斐波那契数列"""
#这是文档字符串,介绍函数的功能,可以根据它自动生成文档,也叫docstring
a, b = 0, 1
while a < n:
print(a, end=' ')
a, b = b, a+b
print()
- 函数可以任意改名,使用方式不变,这在导包时很有用,可以给名字过长的函数取一个短的名字,使用起来更方便。
f = fib
f(10) #效果和fib(10)相同
- 函数的形参可以有默认值,在使用函数的时候,没有默认值的一定要传参,有默认值的可以省略不传参。
函数还可以通过“关键字参数”来调用,如:
def parrot(voltage, state='a stiff', action='voom', type='Chinese Red'):
parrot(1000)
parrot(voltage=1000)
parrot(voltage=1000, action='VoooM')
parrot(1000, action='test')
注意:
1. 在定义函数时,某项形参有默认值,后面的形参必须都有默认值。
2. 使用时,没有默认值的必须传入参数。
3. 使用关键字时,参数的位置没有影响,parrot(voltage=1000, action='VoooM')
和parrot(action='VoooM', voltage=1000)
效果相同
4. 传参时没有指定关键字,则从前往后匹配,若带关键字则位置必须在不带关键字的后面。
- 函数形参中可以有元组和字典
def student(name, *subject, **grade):
# *subject 表示一个元组 **grade 表示一个字典
元组或字典做参数,也叫可变参数。元组和字典前面可以有普通位置参数,后面只能有关键字参数。传入的普通参数值,匹配完位置参数后,多余的会进入元组,即所谓的可变参数。字典有其独特的传参格式,这里先不谈。
- 列表、元组和字典都可以作为单个参数传入函数中
def student(name, sex='girl', age=25):
print(name, sex, age)
stu1 = ('shengbo', 'boy', 23)
stu2 = ['shengbo', 'boy', 23]
stu3 = {'name':'shengbo', 'sex':'boy', 'age':23}
student(*stu1)
student(*stu2)
student(**stu3)
# 输出结果
shengbo boy 23
shengbo boy 23
shengbo boy 23
- Lambda形式的函数:这里先不谈。
14. 列表的使用
- 增加
- list.append(x):将x添加到列表末尾
- list.insert(i,x):将x插入到位置i
- list.extend(L):将列表L整个加到本列表后面
- 删除
- list.remove(x):删除列表中值为x的第一个元素,没有则返回错误
- list.pop(i):从位置i删除元素并范围其值,如果未指定i则删除并返回最后一个元素
- list.clear():删除列表中所有元素
- 其他
- list.index(x):返回列表中第一个值为x的元素的索引
- list.count(x):返回x在列表中出现的次数
- list.sort():对列表就地进行排序
- list.copy():返回列表的浅拷贝
- list.reverse():就地倒排列表中的元素
- del:没有返回值
- del a[1]:删除列表a中索引为1的元素
- del a[2:4]:删除列表a中索引为2、3的元素
- del a:删除变量a
- del a[:]:清空列表a
- 循环
for i, v in enumerate(['tic', 'tac', 'toe']):
print(i, v)
15. 元组
- 创建空元组:a = ()
- 创建仅包含一个元素的元组:a = (‘hello’,)
- 元组可以用来给变量赋值:
a = (1, 2, 3)
x, y, z = a
16. 字典
- 构造
- a = {‘cat’:123, ‘dog’:456, ‘pig’:789}
- a = dict(cat=123, dog=456, pig=780)
关键字必须都是简单字符串
- 循环
- 可用items()同时对键和值循环:
knights = {'gallahad': 'the pure', 'robin': 'the brave'}
for k, v in knights.items():
print(k, v)
17. 格式化输出
- 数值转为字符串
- str():转化为适合人阅读的形式
- repr():转为为供解释器读取的形式,即\r\n等符号不会生效
- 字符串类常用函数
- str.ljust(x):字符串占x列,左对齐,右填充
- str.rjust(x):字符串占x列,右对齐,左填充
- str.center(x):字符串占x列,居中对齐,两边填充
- str.zfill(x):字符串占x列,右对齐,左边用0填充
- 以上如果字符串实际长度过长会原样输出,不会截断。
- str.format()函数
print('we are the {} who say {}'.format('knights','NI'))
>>>we are the knights who say NI
print('{1} {0}'.format('chicken', 'egg'))
>>>egg chicken
print('The {food} is {acjective}'.format(food='spam','acjective=horribe'))
>>>The spam is horribe
number = {'one':'one','two':'two','three':'three'}
print('one:{one};two:{two};three:{three}'.format(**number)
Tip:
1. str.format()左右两边相当于是函数,会把右边的值传给左边,左边用{}花括号表示一个形参。
2. 和函数一样,左边的形参支持位置参数:在花括号中加数字;支持关键字参数:右边赋值时也要加关键字;也支持字典的整体导入。
18. 变量作用域
- 变量默认是
local
类型的,即局部的,这个局部跟变量所处位置有关,在函数里定义的就是仅作用在函数内部,在模块中定义的就作用于整个模块。使用nonlocal
在变量前面修饰可使变量跳出当前作用域也在下一层空间起作用,例如函数中定义了函数,在内函数使用nonlocal
修饰变量可使变量在外函数中也起作用。global
修饰的是全局变量,即变量在整个最大的外层空间都起作用。
19. 导包问题
- 标准模块包可以直接导入对应的.py文件,自定义的包或.py文件要导入貌似路径要加上最大的外层包名。
20. 类的使用
- 类的定义:
class ChildClass(ParentClass):
<statement-1>
...
<statement-N>
Tip:
1. Python有限地支持多继承,语法为class MyClass(Base1, Base2, Base3):
,可以使用super()来动态改变解析顺序,具体使用方法还不知道。
- 类的实例化:
x = MyClass()
- 类的初始化:
class MyClass:
var = 'global'
def __init__(self, name='shengbo', sex='boy', age='0'):
self.name = name
self.sex = sex
self.age = age
Tip:
1. 类中定义的函数都默认有参数self
,表示当前实例。
2. 在__init__
中初始化的都是实例变量,在类里面函数外面定义的都是类变量。初始化函数有无参数都行。
3. 类中任何函数中定义的带有self的变量都是实例变量,都可以被直接访问,但不能在函数外定义带有self的实例变量,只能定义不带self的类变量。
4. 类实例化后,还可以直接给实例加新的实例变量。例如上述MyClass
类,虽然没有事先定义名为“ID”的实例变量,但可以直接赋值x.ID = 1
,后面可以用del x.ID
来删除该变量。
5. 根据上述特性,可以使用一个空类来实现一种特殊的抽象数据结构。
- Python几乎无法做到隐藏数据对象
- 关于Python中的私有变量
- 关于Python类的迭代器、生成器和生成器表达式
21. 基本编码风格
- 命名:
- 模块名必须简短且用小写字母
- 类名用驼峰写法——简写且大写首字母,缩略词如HTTP均大写
- 函数和变量名均用小写字母且用单下划线分隔
- 常量名全大写并用单下划线分隔
- 函数和变量名加单下划线前缀可以避免导包时被导入(non-public),加双下划线前缀可以避免继承时和子类名字冲突(自动加了前缀
_类名
进行混杂)。
22. 不确定参数
- 函数形式为
function(self, *args, **kwargs)
,表示参数个数不确定,可以有大于等于零个位置参数(从*args传入),也可以有大于等于零个关键字参数(从**kwargs传入)。