[Toc]
Python学习笔记1
学习廖雪峰老师Python入门教程,非常感谢~记录自己在学习python过程中的点滴。
1. Python的简介
Python是著名的“龟叔”Guido van Rossum在1989年圣诞节期间,为了打发无聊的圣诞节而编写的一个编程语言。
C语言适合开发那些追求运行速度、充分发挥硬件性能的程序。而Python是用来编写应用程序的高级编程语言。C语言是编译型的语言,Python是解释型的语言
总的来说,Python的哲学就是简单优雅,尽量写容易看明白的代码,尽量写少的代码。
应用
- 网络爬虫
- 自动的去互联网上批量下载需要的资源的程序(代替人类)
- 收集数据
- 大数据,机器学习
- web开发
- 网站(oa,erp,支付宝,微信,qq,吃鸡)
缺点
- 运行速度慢
- 代码不能加密
2. Python的安装
解释器和IDE
- CPython
- IPython
- PyPy
- Jython
- IronPython
- Notepad++
- Anaconda(推荐)
- Pycharm(推荐)
- VScode(推荐)
- Sublime Text(推荐)
3. Python的基本操作
运行
示例代码:
print('hello, world')
运行:
C:\work>python hello.py
hello, world
输出
用print()
在括号中加上字符串,就可以向屏幕上输出指定的文字。比如输出'hello, world'
,用代码实现如下:
>>> print('hello, world')
输入
Python提供了一个input()
,可以让用户输入字符串,并存放到一个变量里。比如输入用户的名字:
name = input('please enter your name: ')
print('hello,', name)
>>> please enter your name: Michael
hello, Michael
4. Python的基础
数据类型和变量
在Python中,能够直接处理的数据类型有以下几种:
- 整数
- 浮点数
- 字符串
- 布尔值
- 空值
- 变量
- 常数
==Tips==:转义字符:\
,r''
表示''
内部的字符串默认不转义,``//''表示整除
对变量赋值x = y
是把变量x
指向真正的对象,该对象是变量y
所指向的。随后对变量y
的赋值不影响变量x
的指向。
字符串和编码
字符编码
- ASCII
- GB2312
- Unicode
- UTF-8
ASCII:由美国人发明,只有127个字符,大小写英文字母、数字和一些符号,比如大写字母A的编码是65,小写字母z的编码是122。
GB2312:为了处理中文,一个字节是不够的,至少需要两个字节,而且还不能和ASCII编码冲突,中国制定了GB2312编码。
Unicode:为避免乱码,Unicode把所有语言都统一到一套编码里,最常用的是用两个字节表示一个字符(如果要用到非常偏僻的字符,就需要4个字节)。现代操作系统和大多数编程语言都直接支持Unicode。
UTF-8:为节约在存储和传输时Unicode编码的存储空间,又出现了把Unicode编码转化为“可变长编码”的UTF-8编码。UTF-8编码把一个Unicode字符根据不同的数字大小编码成1-6个字节,常用的英文字母被编码成1个字节,汉字通常是3个字节,只有很生僻的字符才会被编码成4-6个字节。
字符串
Python 3版本中,字符串是以Unicode编码的,支持多语言。
print('包含中文的str')
print('contain chinese str')
>>>
包含中文的str
contain chinese str
对于单个字符的编码,Python提供了ord()
函数获取字符的整数表示,chr()
函数把编码转换为对应的字符:
>>> ord('A')
65
>>> ord('中')
20013
>>> chr(66)
'B'
>>> chr(25991)
'文'
bytes
类型的数据用带b
前缀的单引号或双引号表示:
x = b'ABC'
以Unicode表示的str通过encode()
方法可以编码为指定的bytes
:
>>> 'ABC'.encode('ascii')
b'ABC'
>>> '中文'.encode('utf-8')
b'\xe4\xb8\xad\xe6\x96\x87'
要把bytes
变为str
,就需要用decode()
方法:
>>> b'ABC'.decode('ascii')
'ABC'
>>> b'\xe4\xb8\xad\xe6\x96\x87'.decode('utf-8')
'中文'
len()
函数计算的是str
的字符数,如果换成bytes
,len()
函数就计算字节数:
>>> len(b'ABC')
3
>>> len(b'\xe4\xb8\xad\xe6\x96\x87')
6
>>> len('中文'.encode('utf-8'))
6
为避免Python代码中注释的乱码,通常在文件开头写上这两行:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
格式化
%
运算符就是用来格式化字符串的,有几个%?
占位符,后面就跟几个变量或者值,顺序对应。常见的占位符有:
-
%s
表示用字符串替换, -
%d
表示用整数替换, -
%f
表示用浮点数替换, -
%x
表示用十六进制整数替换。
>>> 'Hello, %s' % 'world'
'Hello, world'
>>> 'Hi, %s, you have $%d.' % ('Michael', 1000000)
'Hi, Michael, you have $1000000.'
format()
用传入的参数依次替换字符串内的占位符{0}、{1}……
>>> 'Hello, {0}, 成绩提升了 {1:.1f}%'.format('小明', 17.125)
'Hello, 小明, 成绩提升了 17.1%'
使用list和tuple
list
list是一种有序的集合,可以随时添加和删除其中的元素。比如,列出班里所有同学的名字,就可以用一个list表示:
>>> classmates = ['Michael', 'Bob', 'Tracy']
>>> classmates
['Michael', 'Bob', 'Tracy']
用len()
函数可以获得list元素的个数:
>>> len(classmates)
3
用索引来访问list中每一个位置的元素,记得索引是从0
开始的:
>>> classmates[0]
'Michael'
当索引超出了范围时,Python会报一个IndexError
错误,所以,要确保索引不要越界,记得最后一个元素的索引是len(classmates) - 1
。
如果要取最后一个元素,除了计算索引位置外,还可以用-1
做索引,直接获取最后一个元素:
>>> classmates[-1]
'Tracy'
list是一个可变的有序表,所以,可以有以下操作:
-
append()
往list中追加元素到末尾, -
insert()
把元素插入到指定的位置, -
pop()
删除指定位置的元素,默认删除末尾的元素. - 元素替换,在指定位置赋值
list里面的元素的数据类型可以不同,list元素也可以是另一个list。
tuple
另一种有序列表叫元组:tuple。tuple和list非常类似,但是tuple一旦初始化就不能修改。
>>> classmates = ('Michael', 'Bob', 'Tracy')
获取元素的方法和list是一样的,但不能赋值成另外的元素。因为tuple不可变,所以代码更安全。如果可能,能用tuple代替list就尽量用tuple。
使用dict和set
dict
字典,dict全称dictionary,在其他语言中也称为map,使用键-值(key-value)存储,具有极快的查找速度。
>>> d = {'Michael': 95, 'Bob': 75, 'Tracy': 85}
>>> d['Michael']
95
- 赋值:除了初始化时指定外,还可以通过key放入;
- 读取:可通过key值操作,如果key不存在,dict就会报错,为避免,一通过
in
判断key是否存在,二是通过dict提供的get()
方法,如果key不存在,可以返回None
,或者自己指定的value。 - 删除:要删除一个key,用pop(key)方法,对应的value也会从dict中删除.
和list比较,dict有以下几个特点:
- 查找和插入的速度极快,不会随着key的增加而变慢;
- 需要占用大量的内存,内存浪费多。
而list相反:
- 查找和插入的时间随着元素的增加而增加;
- 占用空间小,浪费内存很少。
set
set和dict类似,也是一组key的集合,但不存储value。由于key不能重复,所以,在set中,没有重复的key。
- 创建:需要提供一个list作为输入集合;
- 添加:通过
add(key)
方法可以添加元素到set中,可以重复添加,但不会有效果; - 删除:通过
remove(key)
方法可以删除指定key
元素; - 交并集操作
5. 正则表达式
正则表达式是一种用来匹配字符串的强有力的武器。它的设计思想是用一种描述性的语言来给字符串定义一个规则,凡是符合规则的字符串,我们就认为它“匹配”了,否则,该字符串就是不合法的。
在正则表达式中,如果直接给出字符,就是精确匹配。用\d
可以匹配一个数字,\w
可以匹配一个字母或数字,所以:
-
'00\d'
可以匹配'007'
,但无法匹配'00A'
; -
'\d\d\d'
可以匹配'010'
; -
'\w\w\d'
可以匹配'py3'
; -
.
可以匹配任意字符,所以,'py.'
可以匹配'pyc'
、'pyo'
、'py!'
等等。
要匹配变长的字符,在正则表达式中,
- 用
*
表示任意个字符(包括0个), - 用
+
表示至少一个字符, - 用
?
表示0个或1个字符, - 用
{n}
表示n个字符, - 用
{n,m}
表示n-m个字符.
要做更精确地匹配,可以用[]
表示范围,比如:
-
[0-9a-zA-Z\_]
可以匹配一个数字、字母或者下划线; -
[0-9a-zA-Z\_]+
可以匹配至少由一个数字、字母或者下划线组成的字符串,比如'a100'
,'0_Z'
,'Py3000'
等等; -
[a-zA-Z\_][0-9a-zA-Z\_]*
可以匹配由字母或下划线开头,后接任意个由一个数字、字母或者下划线组成的字符串,也就是Python合法的变量;
[a-zA-Z\_][0-9a-zA-Z\_]{0, 19}
更精确地限制了变量的长度是1-20个字符(前面1个字符+后面最多19个字符)。
Python提供re
模块,包含所有正则表达式的功能。由于Python的字符串本身也用\
转义,所以要特别注意。因此建议使用Python的r
前缀,就不用考虑转义的问题了。
match()
方法判断是否匹配,如果匹配成功,返回一个Match
对象,否则返回None
。
>>> import re
>>> re.match(r'^\d{3}\-\d{3,8}$', '010-12345')
<_sre.SRE_Match object; span=(0, 9), match='010-12345'>
>>> re.match(r'^\d{3}\-\d{3,8}$', '010 12345')
>>>
切分字符串
>>> re.split(r'\s+', 'a b c')
['a', 'b', 'c']
分组
用()
表示的就是要提取的分组(Group)。比如:^(\d{3})-(\d{3,8})$
分别定义了两个组,group(0)
永远是原始字符串,group(1)
、group(2)
……表示第1、2、……个子串。
>>> t = '19:05:30'
>>> m = re.match(r'^(0[0-9]|1[0-9]|2[0-3]|[0-9])\:(0[0-9]|1[0-9]|2[0-9]|3[0-9]|4[0-9]|5[0-9]|[0-9])\:(0[0-9]|1[0-9]|2[0-9]|3[0-9]|4[0-9]|5[0-9]|[0-9])$', t)
>>> m.groups()
('19', '05', '30')
(0[0-9]|1[0-9]|2[0-3]|[0-9])
表示第一位为0第二位为0~9,或者第一位为1第二位为0~9,或者表示第一位为2第二位为0~3,或者只有一位0~9.
6. IO编程
文件读写
读文件
以读文件的模式打开一个文件对象,使用Python内置的open()
函数,传入文件名和标示符:
>>> f = open('/Users/michael/test.txt', 'r')
如果文件不存在,open()
函数就会抛出一个IOError
的错误,并且给出错误码和详细的信息.
如果文件打开成功,调用read()
方法可以一次读取文件的全部内容,Python把内容读到内存,用一个str
对象表示.
最后一步是调用close()
方法关闭文件。
Python引入了with
语句来自动帮我们调用close()
方法:
with open('/path/to/file', 'r') as f:
print(f.read())
若文件过大,可以反复调用read(size)
方法,每次最多读取size个字节的内容。另外,调用readline()
可以每次读取一行内容,调用readlines()
一次读取所有内容并按行返回list
。
要读取二进制文件,比如图片、视频等等,用'rb'
模式打开文件即可.
要读取非UTF-8编码的文本文件,需要给open()
函数传入encoding
参数,例如,读取GBK编码的文件:
>>> f = open('/Users/michael/gbk.txt', 'r', encoding='gbk')
>>> f.read()
'测试'
写文件
写文件和读文件是一样的,唯一区别是调用open()函数时,传入标识符'w'或者'wb'表示写文本文件或写二进制文件:
>>> f = open('/Users/michael/test.txt', 'w')
>>> f.write('Hello, world!')
>>> f.close()
同样可以使用with
语句:
with open('/Users/michael/test.txt', 'w') as f:
f.write('Hello, world!'
要写入特定编码的文本文件,请给open()
函数传入encoding
参数,将字符串自动转换成指定编码。
以'w'
模式写入文件时,如果文件已存在,会直接覆盖(相当于删掉后新写入一个文件)。如果希望追加到文件末尾,可以传入'a'
以追加(append)模式写入。