目录
Python基础
Python使用缩进来组织代码块,请务必遵守约定俗成的习惯,坚持使用4个空格的缩进。
在文本编辑器中,需要设置把Tab自动转换为4个空格,确保不混用Tab和空格。
1 数据类型和变量
计算机顾名思义就是可以做数学计算的机器,因此,计算机程序理所当然地可以处理各种数值。但是,计算机能处理的远不止数值,还可以处理文本、图形、音频、视频、网页等各种各样的数据,不同的数据,需要定义不同的数据类型。在Python中,能够直接处理的数据类型有以下几种:
数据类型
-
整数
如1,100,0xff00 -
浮点数
如1.23,-9.01,12.3e8,1.2e-5 -
字符串
如’abc’,“xyz”。
如果字符串内部既包含’又包含"怎么办?可以用转义字符 \ 来标识,比如:
'I\'m \"OK\"!'
表示的字符串内容是:
I'm "OK"!
- 布尔值
布尔值和布尔代数的表示完全一致,一个布尔值只有True、False两种值,要么是True,要么是False,在Python中,可以直接用True、False表示布尔值(请注意大小写),也可以通过布尔运算计算出来。 - 空值
空值是Python里一个特殊的值,用None表示。None不能理解为0,因为0是有意义的,而None是一个特殊的空值。
此外,Python还提供了列表、字典等多种数据类型,还允许创建自定义数据类型,我们后面会继续讲到。
变量和常量
变量的概念基本上和初中代数的方程变量是一致的,只是在计算机程序中,变量不仅可以是数字,还可以是任意数据类型。
变量在程序中就是用一个变量名表示了,变量名必须是大小写英文、数字和_的组合,且不能用数字开头。
所谓常量就是不能变的变量,比如常用的数学常数π就是一个常量。在Python中,通常用全部大写的变量名表示常量。
2 字符串和编码
- 编码
Python 3的字符串使用Unicode,直接支持多语言。当str和bytes互相转换时,需要指定编码。最常用的编码是UTF-8。
由于Python源代码也是一个文本文件,所以,当你的源代码中包含中文的时候,在保存源代码时,就需要务必指定保存为UTF-8编码。当Python解释器读取源代码时,为了让它按UTF-8编码读取,我们通常在文件开头写上这两行:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
第一行注释是为了告诉Linux/OS X系统,这是一个Python可执行程序,Windows系统会忽略这个注释;
第二行注释是为了告诉Python解释器,按照UTF-8编码读取源代码,否则,你在源代码中写的中文输出可能会有乱码。
- 格式化
在Python中,采用的格式化方式和C语言是一致的,用%实现,举例如下:
>>> 'Hello, %s' % 'world'
'Hello, world'
>>> 'Hi, %s, you have $%d.' % ('Michael', 1000000)
'Hi, Michael, you have $1000000.'
常见的占位符有:
占位符 | 替换内容 |
---|---|
%d | 整数 |
%f | 浮点数 |
%s | 字符串 |
%x | 十六进制整数 |
3 使用list和tuple
list
Python内置的一种数据类型是列表:list。用中括号([ ])表示列表的开始和结束,元素之间用逗号(,)分隔。
list是一种有序的集合,可以随时添加和删除其中的元素。用索引来访问list中每一个位置的元素,记得索引是从0开始的。如果要取最后一个元素,除了计算索引位置外,还可以用-1做索引,直接获取最后一个元素。
列表元素增加:append() insert()
列表元素查找:index()下标方法切片方法in成员运算
列表元素修改:指定下标修改
列表元素删除:clear()pop()remove()del函数
列表元素合并:extend()‘+’号合并
列表元素排序:sort()
列表基本操作方法表格总结:
方法名称 | 方法功能描述 |
---|---|
append | 在列表尾部增加元素 |
clear | 列表清空 |
copy | 复制生成另一个列表 |
count | 统计指定元素个数 |
extend | 两个列表元素合并 |
index | 返回指定元素的下标 |
insert | 在指定位置插入元素 |
pop | 删除并返回指定下标对应的元素 |
remove | 删除列表中指定的元素 |
reverse | 反转列表元素顺序 |
sort | 对列表元素进行排序 |
len | 统计元素个数 |
max | 返回最大值的元素 |
min | 返回最小值的元素 |
tuple | 将列表转换为元组 |
list | 将元组转换为列表 |
type | 返回对象类型 |
del | 删除整个列表/元组对象 |
sum | 对所有元素求和 |
>>> classmates = ['Michael', 'Bob', 'Tracy']
>>> classmates
['Michael', 'Bob', 'Tracy']
tuple
另一种有序列表叫元组:tuple。tuple和list非常类似,主要区别有以下两点:
(1)元组的元素不能变动。
(2)元组用小括号()表示。
在上面的表格中,所有对元素进行修改的函数不能作用于元组,但其他依然可用。
tuple的陷阱:当你定义一个tuple时,在定义的时候,tuple的元素就必须被确定下来。定义有两个元素的tuple、空的tuple、一个元素的tuple分别为:
a=(1,2)
b=()
c=(1,)
只有1个元素的tuple定义时必须加一个逗号,,来消除歧义。否则,就会按小括号进行计算,计算结果是1。
最后来看一个“可变的”tuple:
>>> t = ('a', 'b', ['A', 'B'])
>>> t[2][0] = 'X'
>>> t[2][1] = 'Y'
>>> t
('a', 'b', ['X', 'Y'])
表面上看,tuple的元素确实变了,但其实变的不是tuple的元素,而是list的元素。tuple一开始指向的list并没有改成别的list,所以,tuple所谓的“不变”是说,tuple的每个元素,指向永远不变。即指向’a’,就不能改成指向’b’,指向一个list,就不能改成指向其他对象,但指向的这个list本身是可变的!
理解了“指向不变”后,要创建一个内容也不变的tuple怎么做?那就必须保证tuple的每一个元素本身也不能变。
4 条件判断if
条件判断是python语言基本的条件分支判断语句。
格式一:单分支判断
age = 20
if age >= 18:
print('your age is', age)
print('adult')
格式二:多分支判断
age = 3
if age >= 18:
print('your age is', age)
print('adult')
else:
print('your age is', age)
print('teenager')
格式三:多条件多分支判断
age = 3
if age >= 18:
print('adult')
elif age >= 6:
print('teenager')
else:
print('kid')
5 循环for和while
for…in
Python的循环有两种,一种是for…in循环,依次把list或tuple中的每个元素迭代出来,看例子:
names = ['Michael', 'Bob', 'Tracy']
for name in names:
print(name)
执行这段代码,会依次打印names的每一个元素:
Michael
Bob
Tracy
while
第二种循环是while循环,只要条件满足,就不断循环,条件不满足时退出循环。比如我们要计算100以内所有奇数之和,可以用while循环实现:
sum = 0
n = 99
while n > 0:
sum = sum + n
n = n - 2
print(sum)
在循环内部变量n不断自减,直到变为-1时,不再满足while条件,循环退出。
break和continue
在循环中,break语句可以提前退出循环。也可以通过continue语句,跳过当前的这次循环,直接开始下一次循环。这两个语句通常都必须配合if语句使用。要特别注意,不要滥用break和continue语句。break和continue会造成代码执行逻辑分叉过多,容易出错。大多数循环并不需要用到break和continue语句,下面的两个例子,都可以通过改写循环条件或者修改循环逻辑,去掉break和continue语句。
n = 1
while n <= 100:
if n > 10: # 当n = 11时,条件满足,执行break语句
break # break语句会结束当前循环
print(n)
n = n + 1
print('END')
n = 0
while n < 10:
n = n + 1
if n % 2 == 0: # 如果n是偶数,执行continue语句
continue # continue语句会直接继续下一轮循环,后续的print()语句不会执行
print(n)
6 使用dict和set
dict
Python内置了字典:dict的支持,dict全称dictionary,在其他语言中也称为map,使用键-值(key-value)存储,具有极快的查找速度。用大括号({ })表示字典的开始和结束,元素之间用逗号(,)分隔
>>> d = {'Michael': 95, 'Bob': 75, 'Tracy': 85}
>>> d['Michael']
95
请务必注意,dict内部存放的顺序和key放入的顺序是没有关系的。
和list比较,dict有以下几个特点:
1.查找和插入的速度极快,不会随着key的增加而变慢;
2.需要占用大量的内存,内存浪费多。
而list相反:
1.查找和插入的时间随着元素的增加而增加;
2.占用空间小,浪费内存很少。
所以,dict是用空间来换取时间的一种方法。
dict可以用在需要高速查找的很多地方,在Python代码中几乎无处不在,正确使用dict非常重要,需要牢记的第一条就是dict的key必须是不可变对象。这是因为dict根据key来计算value的存储位置,如果每次计算相同的key得出的结果不同,那dict内部就完全混乱了。这个通过key计算位置的算法称为哈希算法(Hash)。要保证hash的正确性,作为key的对象就不能变。在Python中,字符串、整数等都是不可变的,因此,可以放心地作为key。而list是可变的,就不能作为key:
>>> key = [1, 2, 3]
>>> d[key] = 'a list'
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'list'
字典元素增加:赋值方法setdefault()
字典值查找:字典名+[key]get()
字典值修改:赋值方法update()
字典元素删除:del函数pop()popitem()
字典遍历操作:(1)遍历键值对:items() (2)遍历所有key:for i in 字典变量for i in 字典变量.keys() (3)遍历所有value:for i in 字典变量:print(字典变量[i])for i in 字典变量.values()
字典基本操作方法表格总结
方法名称 | 方法功能描述 |
---|---|
clear | 字典清空 |
copy | 复制生成另外一个字典 |
fromkeys | 使用给定的键建立新的字典。每个键默认对应的值为None |
get | 根据指定键,返回对应值;访问键不存在时,返回None |
items | 以元组数组的形式返回字典中的元素 |
keys | 以可以浏览的类似列表形式返回字典中的键 |
pop | 删除指定键的元素,并返回指定键对应的值 |
popitems | 随机返回元素,并删除元素 |
setdefault | 当字典中的键不存在时,设置键值对;当存在键时,获取键对应的值 |
values | 以可以浏览的类似列表的形式返回字典中的值 |
update | 利用一个字典更新另外一个字典 |
set
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是有序的。。
重复元素在set中自动被过滤:
>>> s = set([1, 1, 2, 2, 3, 3])
>>> s
{1, 2, 3}
通过add(key)方法可以添加元素到set中,可以重复添加,但不会有效果:
>>> s.add(4)
>>> s
{1, 2, 3, 4}
>>> s.add(4)
>>> s
{1, 2, 3, 4}
通过remove(key)方法可以删除元素:
>>> s.remove(4)
>>> s
{1, 2, 3}
set可以看成数学意义上的无序和无重复元素的集合,因此,两个set可以做数学意义上的交集、并集等操作:
>>> s1 = set([1, 2, 3])
>>> s2 = set([2, 3, 4])
>>> s1 & s2
{2, 3}
>>> s1 | s2
{1, 2, 3, 4}
set和dict的唯一区别仅在于没有存储对应的value,但是,set的原理和dict一样,所以,同样不可以放入可变对象,因为无法判断两个可变对象是否相等,也就无法保证set内部“不会有重复元素”。