Python 基础
Python 简介
Python(蟒蛇)由 Guido(仁慈的独裁者)设计开发,是一种解释型语言,简洁但速度慢。Python 拥有丰富的官方库和第三方库,使得 Python 快速快速流行起来。
- 优点:高级,OOP;解释型语言;丰富的库;跨平台。
- 缺点:相对于编译型语言(C/C++,Java 等),速度较慢;代码开源。
Python 解释器
- CPython:Python 官方解释器,用 C 语言编写。
- Ipython:基于 Cpython 的一种交互式解释器。
- JPython:使用 Java 编写的解释器。
- 其他。
使用
which python3
命令查看 Python 解释器的安装路径,一般 Python 解释器大小为 4M 左右,很小。
Python2.x 与 Python3.x
Python3.x 是现在主流更新的版本,Python2.7 是官方的最后一个 2.x 版本。在设计 Python3 时,为了避免引入过多累赘,官方不对下兼容。故 Python2.x 和 Python3.x 是不通的,随着时间的发展,应当选择 Python3。
- Python2.x 不支持中文,默认采用的是 ASCII 编码,而 Python3.x 使用的是 Unicode 编码,支持世界各种语言(可以使用中文变量名)。
- Python3 没有了
long
类型,int
理论没有大小限制。然而在 Python2 中数值大小有限制。
运行 Python 程序
- 使用解释器运行,
python3 xx.py
- 直接运行
- py 文件开头使用 shebang:
#! /usr/bin/env python3
或者#! /usr/bin/python3
- 增加执行权限。
chmod +x xx.py
,然后用命令./xx.py
执行之
- py 文件开头使用 shebang:
shebang 符号
shebang 通常在类 Unix 系统脚本中的第一行开头使用,用于指明执行该脚本文件的解释程序路径。
#! /usr/bin/env python3
# coding:utf-8
Python 基础语法
注释
- 单行注释:
# 单行注释
- 多行注释:3 个单引号或者 3 个双引号括起来。
运算符
- 算术运算符:
+, -, *, **, /, //, %
- +还可用于容器的合并,-还可用于集合求差集,*还可以用于容器重复。
- 比较运算符:
>, <, >=, <=, ==, !=
- 与 C/C++、Java 等语言不同,多个比较运算符会按照数学方式求解。例如,
1<3>2
表示1<3 and 3>2
,结果为True
- 与 C/C++、Java 等语言不同,多个比较运算符会按照数学方式求解。例如,
- 逻辑运算符:
and, or, not
,均为短路运算符。 - 赋值运算符:
=, +=, -=, *=, **=, /=, //=, %=
- 位运算符:
&, |, ~, ^, >>, <<
&、|、^
还可用于集合求交集、并集、对称差集。
- 成员运算符:
in, not in
- 身份运算符:
is, not is
is
用于判断两个变量的引用是否相同。==
用于判断两个变量的值是否相同。
变量
int, float, complex, bool, str, bytes, list, tuple, dict, set
共 10 种类型。
- 数值类型:
int, float, complex, bool
,其余为非数值类型。 - 可变类型:
list, dict, set
,其余为不可变类型。 type(x), id(x), isinstance(x, 类型或元组), 类型(x), eval(str), chr(x), ord(x), bin(x), oct(x), hex(x)
,其中,isinstance()
会自动向上转型,type()
不会。int(非十进制表示的字符串, 该进制)
,例如int('0b0011', 2), int('0o7777', 8), int('0xffff', 16)
Python2 中还有
long
类型,Python3 中只有int
类型,int
理论没有大小限制。在 Python 中,变量和数据是分开存储的,数据保存在内存中,变量中保存的是数据在内存中的位置,即变量中记录着数据的地址(引用)。
数值型
B('0b0101')、O('0o7675')、D、H('0xffff')
。数值型变量可以使用二进制、八进制、十进制(默认)和十六进制表示,其中除了十进制其他为字符串。complex
:a.real, a.imag
- 数学函数:
import math
- 随机函数:
import random
字符串
- 转义字符:
\\, \', \", \n, \r等
- Python 中单引号和双引号,甚至三引号都是一样的,都可以表示 str 类型。这是因为 Python 中没有单独的 char 类型,只有长度为 1 的 str 类型。
- 字符串编码:
Unicode
编码(2 个字节):Python3 默认使用Unicode
编码。ASCII
编码(1 个字节):Python2 默认使用ASCII
编码。故 Python2 不支持中文。
- 字符串运算符:
+, *, [x], [a:b:c]左闭右开原则, in, not in, r'haha'(原始字符串), %(格式字符串), [::-1](字符串逆序)
- str 的内建方法:
capitalize(), splitlines(), index(chr, begin, end), replace(old, new, max), startswith(str), endswith(str), center(len, '*'), isalpha(), istitle(), isalnum(), isdigit(), isupper(), islower(), isdecimal(), find(str, begin, end), strip(), count(str, begin, end), swapcase(), encode("utf-8"), join(list), title(), lower(), upper(), format(), split(str)
'ABC'
和b'ABC'
:虽然二者显示一样,但是前者为str
,后者为bytes
。str
可以通过encode
方法编码为bytes
,bytes
可以通过decode
方法解码为str
。在网络传输或者硬盘存储一般以 bytes 的形式。'abc'.encode('utf-8')
,变成bytes
。b'abc'.decode('utf-8')
,变成str
。
列表
- 列表运算符:
+, *, [x], [a:b:c], in, not in
- 列表嵌套:列表的元素可以是另一个列表,由此可以构成二维数组。
- list 的内建方法:
append(x), insert(index, x), extend(list), pop(序号,默认为-1), remove(x), clear(), count(x), index(x), reverse(), sort(), copy()
元组
- 创建只有一个元素的元组必须在元素后面加一个逗号,避免误认为括号。
- 元组除了无法修改元素以外和 list 功能一样。
- 元组的自动拆包和封装,
a, b = b, a
- tuple 的内建方法:
count(), index()
字典
a = {'name':'Bob', 'age':12}
- dict 的内建方法:
a[key], update(), pop(key), clear(), get(), items(), keys(), values()
集合
- 集合中的元素不重复,利用这个将其他类型强制转换成
set()
可以排除重复元素。 - 集合运算符:
&, |, -, ^
- set 的内建方法:
add(), update(), remove(), discard(), clear()
容器的公共特性及高级特性
- 内建函数:
len(), del(), max(), min(), sum()
- 运算符:
+, *, in, not in, 比较运算符
- 迭代:
- 在 dict 中:
for k,v in dict.items()
- 在 list 中:
for i,v in enumerate(l)
- 在 dict 中:
- 切片:
list, tuple, str[star:end:step]
- 列表生成式:
a = [x*x for x in range(1,11)]
b = [m+n for m in 'ABC' for n in 'XYZ']
c = [d for d in os.listdir()]
d = [x+2 for x in range(100) if x%2 == 0]
e = [[1,2], [3,4], [5,6]]
f = [x for i in e for x in i]
输入和输出
- 输入:
input('提示语')
,返回值均为str
,一般需要进行强制类型转换。 - 输出:
- 普通输出:
print(a, b, c[, end=' '])
- 格式化输出:
print(格式化字符串%(值)
- 普通输出:
关键字
import keyword
print(keyword.kwlist)
三大基本结构
顺序结构
条件结构
- 类型 1
if condition1:
pass
elif condition2:
pass
else:
pass
- 类型 2
语句1 if condition else 语句2
print('haha') if a>0 else print('hehe')
b = 1 if a>0 else 0
False:0,空字符串,空容器,None。True:非 0, 非空字符串, 非空容器, 非 None。
循环结构
- 类型 1
while condition:
pass
else:
pass
- 类型 2
for v in seq:
pass
else:
pass
- 类型 3
循环体:
break
continue
else 可以省略,else 中的语句只有在循环顺利结束才会执行,如果是 break 造成的跳出循环则不执行。
pass 语句即空语句,一般用来占位符。
内建函数
abs(), bin(), oct(), hex(), dir(), eval(), map(), filter(), sorted(), reversed(), int(), float(), complex(), bool(), str(), bytes(), list(), tuple(), dict(), id(), type(), isinstance(), input(), print(), help(), len(), max(), min(), sum(), pow(), divmod(), round(), range(), open(), zip(), enumerate(), hash(), next(), property(), chr(), ord(), hasattr(), setattr(), delattr(), getattr()
- 可以使用
dir(__builtins__)
查看所有的内建函数。 dir()
:输出对象的所有属性和方法。- 不要滥用
eval()
函数。
input_str = input('请输入计算题:')
print(eval(input_str))
__import__('os').system('ls') # 执行终端命令
__import__('os').system('touch aaa.py')
map(), filter(), sorted()
, 均为高阶函数。isinstance(a, (int, float))
, 函数可以判断多个类型其中的一个。range()
在 Python3 中返回的是一个迭代器,在 Python2 中返回的是一个元组。返回一个迭代器速度快并且省空间。hash()
接受一个不可变参数,返回一个整数。这个整数是该参数的特征码(指纹)。
深拷贝与浅拷贝
- 直接赋值:传递对象的引而已。二者的 id 相同。
copy()
:浅拷贝。只拷贝父对象,不拷贝子对象,子对象仍然是引用。deepcopy()
:深拷贝。既拷贝父对象,又拷贝子对象。- 列表的切片
d[a:b]
是浅拷贝。 - 列表乘法是浅拷贝。
当单个对象为不可变类型时,
copy
和deepcopy
都是引用。
当父对象是不可变的,子对象中有一个可变对象时,deepcopy 是深拷贝,然而 copy 还是引用。