0. 介绍
Python版本: 3.X
- Python是一门高级计算机编程语言,简单易用。
- Python的哲学就是 简单优雅。Python为我们提供了非常完善的基础代码库,例如:网络、文件、GUI、数据库等大量内容,而且还有极其丰富的第三方库,使用极其方便、不用重复造轮子。国内外许多大型网站都是用Python写的,比如YouTube、Instagram、豆瓣等等,Google也在大量的使用此语言。
0.1. 适用场景
- 网站后台
- 网络应用
- 自动化工具
- 科学计算(人工智能)
- 把其他语言包装起来(胶水语言)
0.2. 不适用场景
- 操作系统
- 移动应用
- 3D游戏开发
0.3. 缺点
- 解释型语言,相对较慢(C语言)
- 没法加密(源码)
一、Python基础
1. 输入与输出(IO)
1 | PyDev console: starting. |
2. Python编写规范
Python使用 缩进 来组织代码块的,一般约定俗成 4个空格。大小写敏感,**#** 为注释。
1 | a = 6 |
3. 数据类型和变量
计算机不止能处理数据,还能处理文本、音频、视频、图形等等,因此产生了不同的数据类型。
(1).整数
Python中的整数没有大小限制
1 | print(-1,0,1,100,0x1f) |
(2).浮点数
浮点数就是小数,之所以称为浮点数是因为在科学计数法的情况下,可以随意的变动小数点的位置从而改变指数。整数运算是精确的,而浮点数运算是不精确的(四舍五入)。浮点数也没有大小限制,但是超过一定的大小就会inf(无限大)。
1 | print(1.23,10**2,10e1,10e2,1.2e-2) |
(3).字符串
注意单引号、双引号、转义号
1 | >>>print('abc') |
(4).布尔值
与(and) 或(or) 非(not)运算
1 | >>>True |
(5).空值
0 是有意义的,None 是一个特殊的空值
1 | >>>print(None) |
(6).变量
Python是 动态语言,使用变量前无需声明变量类型。而Java是静态语言,需要提前声明。
1 | >>>a = 'ABC' |
(7).常量
用全部 大写的变量名表示常量 是一个惯用的手法。**”//“ 地板除** 永远是整数。
1 | >>>PI = 3.1415926 |
4. 字符串和编码
计算机是美国🇺🇸发明的,因此最开始的ASCII码只有127个字符字母被编辑到计算机内(大小写字母、标点符号等)。后来各个国家也加入了自己语言的相应编码,例如:中国(GB2312)、日本(Shift_JIS)等,这样一来各个国家的编码会出现不可避免的冲突,在一些有各个国家语言的文本里,就会出现乱码显示。
因此Unicode油然而生,他将所有的语言都统一到了一种编码方式中。ASCII编码常用1个字节,Unicode常用2个字节。这样新的问题就诞生了,如果全是英文的文本中,文本所占用的空间就会比原本的多两倍。因此后来又诞生了可变长度的:UTF-8。
计算机系统通用的字符编码方式:在计算机内存中,使用Unicode的编码方式,在保存到硬盘或者传输的过程中,使用UTF-8。
UTF-8 的一个缺点:计算字符串长度和查找子字符串非常没效率。
- 使用记事本:用记事本编辑的时候,从文件读取的UTF-8字符被转换为Unicode字符到内存里,编辑完成后,保存的时候再把Unicode转换为UTF-8保存到文件。
- 浏览网页:服务器会把动态生成的Unicode内容转换为UTF-8再传输到浏览器。网页的源码上会有类似的信息,表示该网页正是用的UTF-8编码。
(1). Python的字符串
Python3.X版本中,字符串是以Unicode编码的,既支持多语言的。
1 | print('包含中文的str') |
字符串对应编码值转换
1
2
3
4
5
6
7
8
9
10ord('A') ##获取字符的整数表示
65
ord('中')
20013
chr(65) ##把编码转换成对应的字符
'A'
chr(20013)
'中'
'\u4e2d' ##如果知道16进制可直接表示
'中'Python字符串类型str在内存中是以Unicode的形式表示,一个字符对应若干字节,如果在网络传输或者磁盘存储,就要转换成字节为单位bytes。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35b'ABC'
b'ABC'
'ABC'.encode('ascii')
b'ABC'
'ABC'.encode('utf-8')
b'ABC'
'中文'.encode('utf-8')
b'\xe4\xb8\xad\xe6\x96\x87'
'中文'.encode('ascii') ##超出了ASCII的范围
Traceback (most recent call last):
File "<input>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1: ordinal not in range(128)
>>> b'ABC'.decode('ascii')
'ABC'
>>> b'\xe4\xb8\xad\xe6\x96\x87'.decode('utf-8')
'中文'
>>> b'\xe4\xb8\xad\xff'.decode('utf-8') ##包含无法解码的字节
Traceback (most recent call last):
File "<input>", line 1, in <module>
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xff in position 3: invalid start byte
b'\xe4\xb8\xff'.decode('utf-8')
Traceback (most recent call last):
File "<input>", line 1, in <module>
UnicodeDecodeError: 'utf-8' codec can't decode bytes in position 0-1: invalid continuation byte
>>> b'\xe4\xb8\xad\xe6\x96'.decode('utf-8')
Traceback (most recent call last):
File "<input>", line 1, in <module>
UnicodeDecodeError: 'utf-8' codec can't decode bytes in position 3-4: unexpected end of data
b'\xe4\xb8\xad\xff'.decode('utf-8',errors='ignore') ##忽略无法解码的字节
'中'计算str包含多少字符:1个中文一般占3个字节,一个英文占1个字节
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16len('ABC')
3
len('中文')
2
len(b'ABC')
3
len(b'中文')
File "<input>", line 1
SyntaxError: bytes can only contain ASCII literal characters.
len(b'\xe4\xb8\xad\xe6\x96\x87')
6
len('中文'.encode('utf-8'))
6
len('ABC'.encode('utf-8'))
3Python解释器读取源码时,为了让他以UTF-8的编码方式读取
1
# -*- coding: utf-8 -*-
输出格式化
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17'Hello,%s' % 'world'
'Hello,world'
'Hello,%s. Are you %d?' % ('world',18)
'Hello,world. Are you 18?'
print('%5d-%05d' % (3, 1)) ##指定整数和浮点数的位数
3-00001
print('%.2f' % 3.1415926)
3.14
'Age: %s. Gender: %s' % (18, 'Male') ##%s比较通用
'Age: 18. Gender: Male'
'growth rate: %d %%' % 100 ##%%表示一个百分号
'growth rate: 100 %'
'Hello, {0}, 成绩提升了 {1:.1f}%'.format('小明', 99.125) ##format()函数,不常用
'Hello, 小明, 成绩提升了 99.1%'
占位符 | 替换内容 |
---|---|
%d | 整数 |
%f | 浮点数 |
%s | 字符串 |
%x | 十六进制 |
(2). list和tuple
列表,list是一种 有序集合,可以随时添加\删除其中的元素。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49'Tom','Bob','Mary','Jone'] nameList = [
nameList
['Tom', 'Bob', 'Mary', 'Jone']
len(nameList)
4
0] nameList[
'Tom'
1] nameList[
'Bob'
4] nameList[
Traceback (most recent call last):
File "<input>", line 1, in <module>
IndexError: list index out of range
1] nameList[-
'Jone'
4] nameList[-
'Tom'
nameList[-5]
Traceback (most recent call last):
File "<input>", line 1, in <module>
IndexError: list index out of range
nameList
['Tom', 'Bob', 'Mary', 'Jone']
'Jack') ##添加 nameList.append(
nameList
['Tom', 'Bob', 'Mary', 'Jone', 'Jack']
##弹出 nameList.pop()
'Jack'
nameList
['Tom', 'Bob', 'Mary', 'Jone']
2,'Jack') ##插入 nameList.insert(
nameList
['Tom', 'Bob', 'Jack', 'Mary', 'Jone']
2) nameList.pop(
'Jack'
##空列表 L = []
L
[]
len(L)
0
123,'abc',True,[1,2]] ##列表可以由多种数据类型组成 L = [
L
123, 'abc', True, [1, 2]] [
len(L)
4元组,有序列表,类似于list,但是其中的元素一经设定将不能修改(既 “指向不变“)。
1
2
3
4
5
6
7
8
9
10
11
12
13##空元组 t = ()
t
()
1,) ##单个元素的元组 t = (
t
(1,)
'a','b',['A','B']) ##嵌套列表的元组 t = (
t
('a', 'b', ['A', 'B'])
2][0] = 'X' t[
2][1] = 'Y' t[
t
('a', 'b', ['X', 'Y'])
(3). 条件判断
计算机之所以可以做许多的自动化任务是因为其可以做条件判断(从上往下判断)。
1 | age = input('please input your age: ') |
(4). 循环
循环是让计算机重复做某事的最有效的方式。不要滥用break\continue,会产生太多分叉。
1 | ## for循环 |
(5). dict和set
Python内置了字典:dict,其他语言称map,key—value,具有极快的查找速度。通过 Hash算法 查找key对应的value。
1 | 'Bob':'66','Tom':'77','Kate':'88','Aaron':'99'} d = { |
dict VS list (空间换时间)
- dict查找和插入的速度极快,且不会随着key的增加而变慢。list相反。
- dict需要占用大量内存,而list不会。
dict的key必须是不可变对象。str是不可变对象,而list是可变对象。
1
2
3
4
5
6
7
8
9
10
11'c','b','a'] l = [
l.sort()
##列表本身发生了变化 l
['a', 'b', 'c']
'abc' s =
'a','A') s1 = s.replace(
##字符串本身没有发生变化 s
'abc'
s1
'Abc'set和dict类似,也是一组key的集合,但是不存value,因此set中没有重复的值。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16set([1,2,2,3]) ##通过list作为输入集合,重复值被过滤 s =
s
{1, 2, 3}
5) ##添加元素 s.add(
s
{1, 2, 3, 5}
3) ##删除元素 s.remove(
s
{1, 2, 5}
set([1,2,3]) s1 =
set([2,3,4]) s2 =
##集合可以做数学中的逻辑运算 s1 & s2
{2, 3}
s1 | s2
{1, 2, 3, 4}