Python学习笔记1

[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的字符数,如果换成byteslen()函数就计算字节数:

>>> 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有以下几个特点:

  1. 查找和插入的速度极快,不会随着key的增加而变慢;
  2. 需要占用大量的内存,内存浪费多。

而list相反:

  1. 查找和插入的时间随着元素的增加而增加;
  2. 占用空间小,浪费内存很少。

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)模式写入。

你可能感兴趣的:(Python学习笔记1)