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.pyhello, world
输出
用print()在括号中加上字符串,就可以向屏幕上输出指定的文字。比如输出'hello, world',用代码实现如下:
>>> print('hello, world')输入
Python提供了一个input(),可以让用户输入字符串,并存放到一个变量里。比如输入用户的名字:
name = input('please enter your name: ')
print('hello,', name)>>> please enter your name: Michael
hello, Michael4. 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)模式写入。
作者:CrazyWolf_081c
链接:https://www.jianshu.com/p/9c532574eda3
随时随地看视频