廖雪峰:Python教程
1.因为计算机只能处理数字,如果要处理文本,就必须先把文本转换为数字才能处理。最早的计算机在设计时采用8个比特bit
作为一个字节,所以,一个字节能表示的最大整数就是255,如果要表示更大的整数,就需要更多的字节。
2.处理中文时一个字节显然是不够的,至少需要两个字节,而且还不能和ASCII
编码冲突,所有,中国制定了GB3212
(国标)编码,用来把中文编进去。
3.各国有各国的标准,就会不可避免地出现冲突,因此,Unicode
(万国码)应运而生,Unicode
把所有语言都统一到一套编码里,这样就不会再有乱码问题。Unicode
标准中,最常用的使用两个字节表示一个字符(如果用到非常偏僻的字符,则需要4个字节)。
4.ASCII
编码和Unicode
编码的区别:
①ASCII
编码是1个字节。
②Unicode
编码通常是2个字节。
5.UTF-8
编码诞生的原因?
①字符A
用ASCII
编码是十进制的65
,二进制的01000001
。如果把ASCII
编码的A
用Unicode
编码,只需要在前面补8
个0
即可。
②如果统一换成Unicode
编码,乱码的问题就迎刃而解了。但是,如果你写的文本基本上都是英文的话,用Unicode
编码会比用ASCII
编码多一倍的存储空间,在存储和传输上就非常的不划算。
③UTF-8
编码把一个Unicode
字符根据不同的数字大小编码成1-6个字节,常用的英文字母被编码成1个字节,汉字通常是3个字节,只有很生僻的字符才会被编码成4-6个字节。
6.小结:现在计算机系统通用的字符编码工作方式。
①在计算机内存中,统一使用Unicode
编码,当需要保存到硬盘或需要传输的时候,就转换为UTF-8
编码。
7.Python3
版本中,字符串是以Unicode
编码的,也就是说Python
的字符串支持多语言。
8.如何将十进制数转换为十六进制:
9.ord()
和chr()
函数 - ordinal & character
10.bytes类型
①存在的原因?
11.encode()
和decode()
- 含有中文的
str
可以用UTF_8
编码为bytes
。 - 含有中文的
str
无法用ASCII
编码,因为中文编码的范围超过了ASCII
编码的范围。
12.要计算str
包含多少个字符,可以用len()
函数。
①如果换成bytes
,len()
函数就计算字节数
- 可见一个中文字符经过
utf-8
编码后通常会占用3个字节,而一个英文字符只占用1个字节。
13.小结
-
str
和bytes
互相转换时,需要指定编码。最常用的就是utf-8
。
14.list
- 列表
①list
是Python
内置的一种数据类型,是一种有序的集合,可以随时添加和删除其中的元素。
②获取列表最后一个元素的两种方式:
③不止-1
喔,还可以-2,-3... a[-i] = a[len(a)+(-i)]
④list是一个可变的有序表,因此,可以往list
中追加元素到末尾:
⑤那怎么删除list
末尾的元素呢? - pop()
⑥pop(i)
还可以删除指定位置的元素喔:
⑦要把某个元素换成别的元素,可以直接复制给对应的索引位置:
15.tuple
①是什么?另一种有序列表,叫元组。
②和list
的区别?
-
tuple
一旦初始化就不能修改。也就不能用append()
,insert()
,pop()
这样的方法。
③tuple
的存在的意义?
- 因为
tuple
不可变,所以代码更安全。
④tuple
是如何表示的?
⑤这样表示存在一种歧义:如果tuple内仅有1个数据,注意要加个逗号,
喔!!!
- 因为圆括号
()
既可以表示tuple
,也可以表示数学公式中的小括号。因此,Python
规定,在这种情况下,按小括号进行计算,计算结果为1。
⑥tuple
所谓的"不变",是指:指向永远不变。即指向'a'
,就不能改成'b'
,指向一个list
,就不能改成指向其他对象,但是指向的这个list
本身是可变的!
16.小结
①list
和tuple
是Python
内置的有序集合,一个可变,一个不可变。
17.if
语句执行的特点,从上到下,如果在某个判断是True
,则执行该判断对应的语句,就忽略掉剩下的elif
和else
。
if x: //x为0,空字符串,空list时,判断为False
18.input()
返回的数据类型是str
。
解决:用int()
将str
转换为整数
19.计算1+2+...+100
20.我想打印1-10中的所有奇数?
①方法1
②continue
的一大坑
③正确使用continue
获取1-10中的奇数
21.小结
①break
语句可以在循环过程中直接退出循环。
②continue
语句可以提前结束本轮循环(本轮循环continue
之后的语句将不再执行),直接开始下一轮循环。
③命令行模式下,如果死循环了,Ctrl+C
或直接关闭窗口。
22.dict
①Python
内置了字典:dict
的支持dictionary
,其他语言中也称为map
,使用键-值key-value
存储,具有极快的查找速度。
②dict
和list
的区别?
- 假设我们需要在一本字典中找到一个字,
dict
的做法是在字典的索引列表中找到这个字对应的页码,然后直接翻到该页;而list
是从第一页开始,一页一页往后翻。
③由于一个key
只能对于一个value
,所以,"长江后浪推前浪"
④如果key
不存在,dict
就会报错 - KeyError
。
⑤为了避免这种情况,就需要提前判断该key
是否存在?
- 方法一:
in
操作符
- 方法二:
dict
提供的get()
方法
- 注意:返回None
时,Python
交互式命令行不显示结果。
⑥如何删除一个key?
-
pop(key)
,对于的value
也会从dict
中删除。
⑦注意:dict
内部存放的顺序和key
放入的顺序是没有关系的。
⑧和list
相比,dict
有的特点:速度 & 内存
- 查找和插入的速度极快,不会随着
key
的增加而变慢。 - 但是需要占用大量的内存,内存浪费多。
⑨list
的特点:
- 查找和插入的时间随着元素的增加而增加。
- 占用空间小,消耗的内存很少。
⑩dict
的key
必须是不可变的对象。
- 因为
dict
是根据key
来计算value
的存储位置。在Python
中,字符串、整数都是不可变的,而list
是可变的,因此它不能作为key
。
23.set
①是什么?
-
set
和dict
类似,也是一组key
的集合。由于key
不能重复,所以,在set
中,没有重复的key
。
②如何创建一个set
?
- 需要提供一个
list
作为输入集合。
③如何往set中添加元素?
-
add(key)
,可以重复添加,但无效果。
④如何删除set中的元素?
remove(key)
⑤set
可以看成数学意义上的无需和无重复元素的集合,因此,两个set
可以做数学意义上的交集、并集等操作。
24.不可变对象
①是什么?
- 调用对象自身的任何方法,都不会改变对象自身的内容。
- 注:列表
list
是可变对象,因为,当它调用自身的sort()
方法时改变了其本身。
- 注:字符串
s1
本身不变,永远是"Hello"
。s1
本身只是一个变量,它指向的对象的内容才是"Hello"
。当我们调用s1.replace('H','h')
时,实际上调用方法replace()
是作用在字符串对象"Hello"
上的,它并没有改变字符串"Hello"
的内容,而是创建了一个新的字符串"hello"
并返回。此时,变量s2
指向该新的字符串对象"hello"
。
25.借助抽象,我们不用关系底层的具体计算过程,而直接在更高层次上思考问题(高级程序语言)。
- 函数,就是一种基本的代码抽象方式。
26.导致TypeError
错误的原因?
①调用函数时,传入的参数数量不对。
27.max()
函数可以接收任意多个参数,并返回最大的那个。
28.数据类型转换
①int()
| float()
| str()
| bool()
②函数名实际上就是指向函数对象的一个引用,完全可以把函数名赋给一个变量,相当于给这个函数起了个"别名"。
29.小结
①调用Python
的函数,需要根据函数定义,传入正确的参数。
30.定义函数
①如果定义的函数中没有return
语句,函数执行完毕后也会返回结果,只是结果是None
。
②return None
可以简写为return
③
from exercise1 import my_abs
//1.注意文件exercise1不加后缀py
//2.从exercise1文件中引入my_abs这个函数
④如果你想定义一个什么事也不做的空函数,可以用pass
语句。
def nop():
pass
⑤空函数有什么用?
-
pass
可以用来当做占位符,比如现在还没想好怎么写函数的代码,就可先放个pass
占个坑。
31.参数检查
①自己定义的my_abs
和内置的abs
函数的区别?
- 缺少参数检查。
②完善以下my_abs
函数
③isinstance()
怎么用的?
isinstance(object,classinfo) //用来判断一个对象是否是一个已知的类型
//object - 实例对象
//classinfo - 可以是直接或间接类名、基本类型或者它们组成的元组。
注:
type()
和isinstance()
的区别?
①type()
不考虑继承。
②isinstance()
考虑继承。
④raise
怎么用的?
- 当程序出现错误,
Python
会自动引发异常,也可以通过raise
显式地引发异常。一旦执行了raise
语句,raise
后面的语句将不能执行(同continue)。
32.小结
①定义函数时,需要确定函数名和参数个数。
②最好先对参数的数据类型做检查。
③函数体内部可以用return
随时返回函数结果。
④函数执行完毕也没有return
语句时,自动return None
。
⑤函数可以同时返回多个值,其实就是一个tuple
。
33.设置一个函数,求ax^2+bx+c = 0
的解。
①import math
- math.sqrt
②只有当a,b,c
全部满足int
或float
时,才进行下一步,否则异常。
if not isinstance(a,(int,float)) and isinstance(b,(int,float)) and
isinstance(c,(int,float)) //从右往左
//若满足以上条件
raise TypeError("Bad operand Type!")
③当b*b-4*a*c >= 0
时
x1 = (-b + math.sqrt(b*b-4*a*c))/(2*a)
x2 = (-b - math.sqrt(b*b-4*a*c))/(2*a)
return x1,x2
//否则无解
else:
print("无解")