廖雪峰《Python3 基础教程》读书笔记——第三章

本文详细介绍了Python的基础知识,包括数据类型、变量、字符串处理、编码、列表与元组、条件判断及循环等内容,适合初学者快速入门。

第三章Python基础

Python使用缩进来组织代码块,请务必遵守约定俗成的习惯,坚持使用4个空格的缩进。

在文本编辑器中,需要设置把Tab自动转换为4个空格,确保不混用Tab和空格。

3.1 数据类型和变量

1、整数

2、浮点数

3、字符串

(1)字符串是以单引号'或双引号"括起来的任意文本;

(2)如果'本身也是一个字符,那就可以用""括起来,比如"I'm OK"包含的字符是I,',m,空格,O,K这6个字符。

(3)如果字符串内部既包含'又包含"怎么办?可以用转义字符\来标识。

(4)转义字符\。基本上与C语言的一致

(5)python允许使用r‘’表示‘’内部的字符串默认不转义。

>>>print(r’\\\t\\’)

\\\t\\

(6)如果字符串内部有很多换行,用\n写在一行里不好阅读,为了简化,python允许使用’’’…’’’的格式表示多行内容。

>>> print('''line1

... line2

... line3''')

line1

line2

line3

如果写成程序

print('''line1
line2
line3''')

1、  布尔值(True、False)

布尔值可以用and,or,not运算

2、  空值

空值是Python里一个特殊的值,用None表示。None不能理解为0,因为0是有意义的,而None是一个特殊的空值。

3、  列表、字典、创建自定义数据类型

4、  变量

在Python中,等号=是赋值语句,可以把任意数据类型赋值给变量,同一个变量可以反复赋值,而且可以是不同类型的变量,例如:

a = 123 # a是整数

print(a)

a = 'ABC' # a变为字符串

print(a)

5、  常量

在Python中,通常用全部大写的变量名表示常量:

PI = 3.14159265359

但事实上PI仍然是一个变量,Python根本没有任何机制保证PI不会被改变,所以,用全部大写的变量名表示常量只是一个习惯上的用法,如果你一定要改变变量PI的值,也没人能拦住你。

9、地板除(//)和取余(%)

10//3 = 3;10%3=1

小结

(1)Python支持多种数据类型,在计算机内部,可以把任何数据都看成一个“对象”,而变量就是在程序中用来指向这些数据对象的,对变量赋值就是把数据和变量给关联起来。

(2)注意:Python的整数没有大小限制,而某些语言的整数根据其存储长度是有大小限制的,例如Java对32位整数的范围限制在-2147483648-2147483647。

(3)Python的浮点数也没有大小限制,但是超出一定范围就直接表示为inf(无限大)。

3.2 字符串和编码

1、ASCII,Unicode,UTF-8

(1)ASCII:最早只有127个字符被编码到计算机里,也就是大小写英文字母、数字和一些符号,这个编码表被称为ASCII编码。

(2)Unicode:Unicode把所有语言都统一到一套编码里,这样就不会再有乱码问题了。Unicode标准也在不断发展,但最常用的是用两个字节表示一个字符(如果要用到非常偏僻的字符,就需要4个字节)。现代操作系统和大多数编程语言都直接支持Unicode。

(3)UTF-8:如果统一成Unicode编码,乱码问题从此消失了。但是,如果你写的文本基本上全部是英文的话,用Unicode编码比ASCII编码需要多一倍的存储空间,在存储和传输上就十分不划算。

所以,本着节约的精神,又出现了把Unicode编码转化为“可变长编码”的UTF-8编码。UTF-8编码把一个Unicode字符根据不同的数字大小编码成1-6个字节,常用的英文字母被编码成1个字节,汉字通常是3个字节,只有很生僻的字符才会被编码成4-6个字节。如果你要传输的文本包含大量英文字符,用UTF-8编码就能节省空间。

ASCII编码实际上可以被看成是UTF-8编码的一部分,所以,大量只支持ASCII编码的历史遗留软件可以在UTF-8编码下继续工作。

 

(4)下现在计算机系统通用的字符编码工作方式:

在计算机内存中,统一使用Unicode编码,当需要保存到硬盘或者需要传输的时候,就转换为UTF-8编码。

用记事本编辑的时候,从文件读取的UTF-8字符被转换为Unicode字符到内存里,编辑完成后,保存的时候再把Unicode转换为UTF-8保存到文件:


浏览网页的时候,服务器会把动态生成的Unicode内容转换为UTF-8再传输到浏览器:


2、Python字符串

(1)Python 3版本中,字符串是以Unicode编码的,也就是说,Python的字符串支持多语言。

(2)对单个字符的编码,ord()函数获取字符的整数表示,chr()函数把编码转换成对应的字符

(3)如果知道字符的整数编码,还可以用十六进制这么写str:

>>> '\u4e2d\u6587'

'中文'

(4)由于python的字符串类型是str,在内存中以Unicode表示,一个字符对应若干个字节。如果要在网络上传输,或者保存到磁盘上,就需要把str变为以字节为单位的bytes

python对bytes类型的数据用带b前缀的单引号或双引号表示:

x=b’ABC’

(5) 以Unicode表示的str通过encode()方法可以编码为指定的bytes.

>>> 'ABC'.encode('ascii')

b'ABC'

>>> '中文'.encode('utf-8')

b'\xe4\xb8\xad\xe6\x96\x87'

>>> '中文'.encode('ascii')

Traceback (most recent call last):

  File"<stdin>", line 1, in <module>

UnicodeEncodeError: 'ascii' codec can't encode characters inposition 0-1: ordinal not in range(128)

纯英文的str可以用ASCII编码为bytes,内容是一样的,含有中文的str可以用UTF-8编码为bytes。含有中文的str无法用ASCII编码,因为中文编码的范围超过了ASCII编码的范围,Python会报错。

在bytes中,无法显示为ASCII字符的字节,用\x##显示。

(6) 反过来,如果我们从网络或磁盘上读取了字节流,那么读到的数据就是bytes。要把bytes变为str,就需要用decode()方法:

>>> b'ABC'.decode('ascii')

'ABC'

>>> b'\xe4\xb8\xad\xe6\x96\x87'.decode('utf-8')

'中文'

(7)len()函数计算的是str的字符数,如果换成bytes,len()函数就计算字节数。

可见,1个中文字符经过UTF-8编码后通常会占用3个字节,而1个英文字符只占用1个字节。

(8)在操作字符串时,我们经常遇到str和bytes的互相转换。为了避免乱码问题,应当始终坚持使用UTF-8编码对str和bytes进行转换。

(9)由于Python源代码也是一个文本文件,所以,当你的源代码中包含中文的时候,在保存源代码时,就需要务必指定保存为UTF-8编码。当Python解释器读取源代码时,为了让它按UTF-8编码读取,我们通常在文件开头写上这两行:

#!/usr/bin/env python3

# -*- coding: utf-8 -*-

第一行注释是为了告诉Linux/OS X系统,这是一个Python可执行程序,Windows系统会忽略这个注释;

第二行注释是为了告诉Python解释器,按照UTF-8编码读取源代码,否则,你在源代码中写的中文输出可能会有乱码。

申明了UTF-8编码并不意味着你的.py文件就是UTF-8编码的,必须并且要确保文本编辑器正在使用UTF-8 without BOM编码:

(10)格式化

在Python中,采用的格式化方式和C语言是一致的,用%实现。

常见的占位符有:

%d 整数

%f 浮点数

%s 字符串

%x 十六进制整数

其中,格式化整数和浮点数还可以指定是否补0和整数与小数的位数:

>>> '%2d-%02d' % (3, 1)

' 3-01'

>>> '%.2f' % 3.1415926

'3.14'

如果你不太确定应该用什么,%s永远起作用,它会把任何数据类型转换为字符串:

 

>>> 'Age: %s. Gender: %s' % (25, True)

'Age: 25. Gender: True'

有些时候,字符串里面的%是一个普通字符怎么办?这个时候就需要转义,用%%来表示一个%:

>>> 'growth rate: %d %%' % 7

'growth rate: 7 %'

 

【小结】

Python 3的字符串使用Unicode,直接支持多语言。

str和bytes互相转换时,需要指定编码。最常用的编码是UTF-8。Python当然也支持其他编码方式,比如把Unicode编码成GB2312:

>>> '中文'.encode('gb2312')

b'\xd6\xd0\xce\xc4'

但这种方式纯属自找麻烦,如果没有特殊业务要求,请牢记仅使用UTF-8编码。

格式化字符串的时候,可以用Python的交互式命令行测试,方便快捷。

 

3.3 使用list(列表)和tuple(字典)

1、list(列表)

(1)list是一种有序的集合,可以随时添加和删除其中的元素。

>>> classmates = ['Michael', 'Bob', 'Tracy']

(注意使用的是[])

classname就是一个list

(2)len()函数可以获得list元素的个数

len(classname)

(3)用索引来访问list中每个位置的元素,索引是从0开始的

classname[0],classname[1]

(4)要取得最后一个元素,还可以用-1做索引,直接获取最后一个元素

>>>classname[-1]

以此类推,可以获取倒数第2个、倒数第3个:

(1)append()函数追加元素到末尾

>>>classname.append(‘mike’)

(7)insert()函数可以把元素插入到指定的位置,比如索引号为i的位置

classname.insert(2,‘david’)

(8)pop()函数删除list末尾的元素

classname.pop()

要删除指定位置的元素,用pop(i)方法,其中i是索引位置:

(9)要把某个元素替换成别的元素,可以直接赋值给对应的索引位置

Classname[1]=’sary’

(10)list里面元素的数据类型可以不同

L=[‘APPLE’,1234,True]

(11)list元素也可以是另一个list

s=[‘python’,’java’,[‘asp’,’php’]]

其中s[2][1]=’php’

(12)如果一个list中一个元素都没有,就是一个空的list,长度为0.

L=[]

>>>Len(L)

0

2、tuple(元组)

tuple一旦初始化后就不能修改。

>>>classname=(‘mike’’david’’jone’)

(1)   tuple没有insert(),append(),pop()这些方法

(2)   获取元素的方法和list一样,classname[0],classname[-1]

(3)  tuple的意义:因为tuple不变,所以代码更安全,如果有可能,能用tupledaitilist就尽量使用tuple

(4)   tuple陷阱:当定义一个tuple时,tuple元素就必须确定下来

(5)   如果要定义一个空的tuple,可以写成():

>>>t = ()

(6)只有1个元素的tuple定义时必须加一个逗号,,来消除歧义:

>>>t = (1,)

Python在显示只有1个元素的tuple时,也会加一个逗号,,以免你误解成数学计算意义上的括号。

(7)可变的tuple

>>>t = (‘a’,’b’,[‘A’,’B’])

t[2][0]=’mike’

t[2][1]=’jone’

>>>t

 (‘a’,’b’,[‘mike’,’jone’])

 

【小结】

list和tuple是python内置的有序集合,一个可变,一个不可变。根据需要来选择它们。

 

3.4 条件判断

1、if, if…else, if…elseif…if

(1)if语句【注意:不要忘了if语句后面要添加‘:’

用if语句实现条件判断:

age = 20

if age >= 18:

    print('your age is',age)

print('adult')

(2)if… else语句

age = 3

if age >= 18:

    print('your age is',age)

    print('adult')

else:

    print('your age is',age)

print('teenager')

(3)elseif

可以用elif做更细致的判断:

age = 3

if age >= 18:

    print('adult')

elif age >= 6:

    print('teenager')

else:

print('kid')

 

elif是else if的缩写,完全可以有多个elif,所以if语句的完整形式就是:

if <条件判断1>:

    <执行1>

elif <条件判断2>:

    <执行2>

elif <条件判断3>:

    <执行3>

else:

<执行4>

2、再议input()

birth = input('birth: ')

if birth < 2000:

    print('00前')

else:

    print('00后')

输入1982,结果报错:

Traceback (most recent call last):

File "<stdin>", line 1, in <module>

TypeError: unorderable types: str() > int()

这是因为input()返回的数据类型是str,str不能直接和整数比较,必须先把str转换成整数。

Python提供了int()函数来完成这件事情:

s = input('birth: ')

birth = int(s)

if birth < 2000:

    print('00前')

else:

print('00后')

3.5 循环

循环有两种型式:

1、  for…in

依次把list或者tuple中的每个元素迭代出来

names = ['Michael', 'Bob', 'Tracy']

for name in names:

print(name)

python提供一个range()函数,可以生成一个整数序列,再通过list()函数可以转换为list。

2、  while

第二种循环是while循环,只要条件满足,就不断循环,条件不满足时退出循环。

sum = 0

n = 99

while n > 0:

    sum = sum + n

    n = n - 2

print(sum)

3、  break

在循环中,break语句可以提前退出循环。

如果要提前结束循环,可以用break语句:

n = 1

while n <= 100:

    if n > 10: # 当n = 11时,条件满足,执行break语句

        break # break语句会结束当前循环

    print(n)

    n = n + 1

print('END')

4、  continue

在循环过程中,也可以通过continue语句,跳过当前的这次循环,直接开始下一次循环。

n = 0

while n < 10:

    n = n + 1

    if n % 2 == 0: # 如果n是偶数,执行continue语句

        continue #continue语句会直接继续下一轮循环,后续的print()语句不会执行

    print(n)

continue的作用是提前结束本轮循环,并直接开始下一轮循环。

 

3.6 使用dict和set

1、字典dict{}

(1)在其他语言中称为map,使用键-值(key-value)存储

>>>d = {‘mike’:95,’bob’:75,’tracy’:85}

>>>d[‘mike’]

95

(2)把数据放入dict的方法,除了初始化时指定外,还可以通过key放入:

>>> d['Adam'] = 67

(3)由于一个key只能对应一个value,所以,多次对一个key放入value,后面的值会把前面的值冲掉.

(4)如果key不存在,dict就会报错

(5)要避免key不存在的错误,有两种办法,

一是通过in判断key是否存在:

>>> 'Thomas' in d

False

二是通过dict提供的get方法,如果key不存在,可以返回None,或者自己指定的value:

>>> d.get('Thomas')

>>> d.get('Thomas', -1)

-1

注意:返回None的时候Python的交互式命令行不显示结果。

(6)要删除一个key,用pop(key)方法,对应的value也会从dict中删除:

(7)请务必注意,dict内部存放的顺序和key放入的顺序是没有关系的。

(8)和list比较,dict有以下几个特点:

查找和插入的速度极快,不会随着key的增加而变慢;

需要占用大量的内存,内存浪费多。

而list相反:

查找和插入的时间随着元素的增加而增加;

占用空间小,浪费内存很少。

所以,dict是用空间来换取时间的一种方法。

(9)dict可以用在需要高速查找的很多地方,在python代码中几乎无处不在,正确使用dict非常重要,需要牢记的第一条就是dict的key必须是不可变对象。

(10)通过key计算位置的算法称为哈希算法(Hash)。

要保证hash的正确性,作为key的对象就不能变。在Python中,字符串、整数等都是不可变的,因此,可以放心地作为key。而list是可变的,就不能作为key。

2、set

(1)set和dict类似,也是一组key的集合,但不存储value。由于key不能重复,所以,在set中,没有重复的key。

要创建一个set,需要提供一个list作为输入集合:

>>> s = set([1, 2, 3])

>>> s

{1, 2, 3}

注意,传入的参数[1, 2, 3]是一个list,而显示的{1, 2, 3}只是告诉你这个set内部有1,2,3这3个元素,显示的顺序也不表示set是有序的。

(2)重复元素在set中自动被过滤:

>>> s = set([1, 1, 2, 2, 3, 3])

>>> s

{1, 2, 3}

(3)通过add(key)方法可以添加元素到set中,可以重复添加,但不会有效果。

(4)通过remove(key)方法可以删除元素。

(5)set可以看成数学意义上的无序和无重复元素的集合,因此,两个set可以做数学意义上的交集、并集等操作:

>>> s1 = set([1, 2, 3])

>>> s2 = set([2, 3, 4])

>>> s1 & s2

{2, 3}

>>> s1 | s2

{1, 2, 3, 4}

(6)set和dict的唯一区别仅在于没有存储对应的value,但是,set的原理和dict一样,所以,同样不可以放入可变对象,因为无法判断两个可变对象是否相等,也就无法保证set内部“不会有重复元素”。

 

3.7 再议不可变对象

str是不变对象,list是可变对象

对于不可变对象str的操作:

>>> a = 'abc'

>>> a.replace('a','A')

'Abc'

>>> a

'abc'

等价于下面:

>>> a = 'abc'

>>> b =a.replace('a', 'A')

>>> b

'Abc'

>>> a

'abc'

【小结】

使用key-value存储结构的dict在Python中非常有用,选择不可变对象作为key很重要,最常用的key是字符串。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值