Day13:Python基础
Python就为我们提供了非常完善的基础代码库,覆盖了网络、文件、GUI、数据库、文本等大量内容,被形象地称作“内置电池(batteries included)”。
输入输出
# 输出字符串
print('Hello,World!')
# 用“,”隔开,可以连成一串输出。
print('hard','world!')
# 可以打印整数或者计算结果。
print(100+200) //输出:300
# 输入
name=input() //可以加参数,输出到屏幕上
print()控制输出样式
# r '' 表示内部的字符串默认不转义
print(r'')
# ''' ''' 表示多行内容
print(''' line1
line2
line3''')
#
注释
# 这是一段python注释
数据类型和变量
python是动态语言:定义变量的时候不用指定类型。
空值
用None表示。不是NULL。
整数的除法
-
/除法计算结果是浮点数,即使两个整数恰好整除,结果也是浮点数
-
//,地板除。结果是整数
字符串和编码
ASCII,Unicode,UTF-8
| 字符 | ASCII | Unicode | UTF-8 |
|---|---|---|---|
| A | 01000001 | 00000000 01000001 | 01000001 |
ASCII存英文和数字等,通常存1个字节。Unicode存一切,通常占2个字节,但是当编码里只有英文时,就浪费了一个字节的空间,就出现了可变长的编码集UTF-8。UTF-8的英文占一个字节,中文通常是3个字节。可见,如果文件中大部分是英文,UTF-8可以节省不少空间。
在Python3中,字符串是以Unicode编码的。
python提供了ord()函数获取字符的整数表示,chr()函数把编码转换为对应的字符。
由于Python的字符串类型是str,在内存中以Unicode表示,一个字符对应若干个字节。如果要在网络上传输,或者保存到磁盘上,就需要把str变为以字节为单位的bytes。
Python对bytes类型的数据用带b前缀的单引号或双引号表示:
x = b'ABC'
X='ABC'
#虽然两者显示内容一样,但后者是str类型,后者是bytes,每一个字符占一个字节。
以Unicode表示的str通过encode()方法可以编码为指定的bytes
'ABC'.encode('ascii') # 输出: b'ABC'
'中文'.encode('utf-8') # 输出:b'\xe4\xb8\xad\xe6\x96\x87'
反过来,如果我们从网络或磁盘上读取了字节流,那么读到的数据就是bytes。要把bytes变为str,就需要用decode()方法:
b'ABC'.decode('ascii') #输出: 'ABC'
如果包含无法解码的字节,decode()会报错,可以传入errors='ignore'忽略错误的字节。
b'\xe4\xb8\xad\xff'.decode('utf-8', errors='ignore')
要计算str包含多少个字符,可以用len()函数。
>>> len('中文')
2
如果是bytes,len()函数就计算字节数
>>> len('中文'.encode('utf-8')) # 一般1个中文字符经过UTF-8编码后通常会占用3个字节。
6
在操作字符串时,我们经常遇到str和bytes的互相转换。为了避免乱码问题,应当始终坚持使用UTF-8编码对str和bytes进行转换。
由于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'
'Hi, %s, you have $%d.' % ('Michael', 1000000)
%运算符就是用来格式化字符串的。在字符串内部,%s表示用字符串替换,%d表示用整数替换,有几个%?占位符,后面就跟几个变量或者值,顺序要对应好。如果只有一个%?,括号可以省略
C语言中用’,‘隔开,Python用’%‘隔开。
使用list和tuple
列表:list
Python内置的一种数据类型,列表。
list是一种有序的集合,可以随时添加和删除其中的元素。
classmates=['Michael','Bob','Tracy']
len(classmates) >>> 3
用索引可以访问list中每一个位置的元素,从0开始。
classmates[0] >>> 'Michael'
如果要取最后一个元素,可以用-1做为索引
list是一个可变的有序表,所以,可以往list中追加元素到末尾:
classmates.append('Adams')
也可以把元素插入到指定的位置,比如索引号为1的位置:
classmates.insert(1,'Jack')
删除list末尾的元素,用pop()方法
可以加参数删除指定位置的元素(索引从0开始)
classmates.pop()
classmates.pop(1)
list里面的元素类型可以不同,甚至可以是list。例如:
newlist=['python','c',['java','javascript']]
tuple 元组
一旦初始化就不能修改。
classmates=('A','B','C')
不可变的tuple有什么意义?因为tuple不可变,所以代码更安全。如果可能,能用tuple代替list就尽量用tuple。
注意:如果定义只有一个元素的tuple,需要加上',',不然会被认为是一个元素。
# 错误定义
t=(1)
# 正确定义
t=(1,)
t=('jw',['solo','code'],'027') >>>('jw',['solo','code'],'027')
t[1][0]='music' >>>('jw',['music','code'],'027')
表面上看,tuple的元素确实变了,但其实变的不是tuple的元素,而是list的元素。tuple一开始指向的list并没有改成别的list,所以,tuple所谓的“不变”是说,tuple的每个元素,指向永远不变。即指向'a',就不能改成指向'b',指向一个list,就不能改成指向其他对象,但指向的这个list本身是可变的!
条件判断
语法和其他语言基本一致。
不一样的是,Python靠缩进分块。
age=20
if age>=18:
print('your age is',age)
print('adult')
else:
print('teenager')
注意不要少写冒号。
if语句的完整形式就是:
if <条件判断1>:
<执行1>
elif <条件判断2>:
<执行2>
elif <条件判断3>:
<执行3>
else:
<执行4>
再议 input
age=input('age:')
if age>=18:
print('adult')
else:
print('teenager')
报错:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unorderable types: str() > int()
input()返回的数据类型是str,str不能直接和整数比较,所以我们应该先把str转换成整数。
可以用int()将str转化成int型。
age1=input('age:')
age2=int(age1)
if age2>=18:
print('adult')
else:
print('teenager')
如果我们输入的是’abc‘ 这时会报错,
当int()函数发现字符串不是一个合法的数字时就会报错。
循环
Python的循环有两种,一种是for...in循环,依次把list或tuple中的每个元素迭代出来。
-
for ... in ... :
看例子:
names = ['Michael', 'Bob', 'Tracy']
for name in names:
print(name)
所以for x in ...循环就是把每个元素代入变量x,然后执行缩进块的语句。
如果要计算1-100的整数之和,从1写到100有点困难,幸好Python提供一个range()函数,可以生成一个整数序列,再通过list()函数可以转换为list。比如range(5)生成的序列是从0开始小于5的整数:
list(range(5))
-
While循环
sum = 0
n = 99
while n > 0:
sum = sum + n
n = n - 2
print(sum)
break
n = 1
while n <= 100:
if n > 10: # 当n = 11时,条件满足,执行break语句
break # break语句会结束当前循环
print(n)
n = n + 1
print('END')
continue
在循环过程中,也可以通过continue语句,跳过当前的这次循环,直接开始下一次循环。
n = 0
while n < 10:
n = n + 1
if n % 2 == 0: # 如果n是偶数,执行continue语句
continue # continue语句会直接继续下一轮循环,后续的print()语句不会执行
print(n)
使用dict和set
Python内置了字典:dict的支持,dict全称dictionary,在其他语言中也称为map,使用键-值(key-value)存储,具有极快的查找速度。
举个例子,假设要根据同学的名字查找对应的成绩,如果用list实现,需要两个list:
names = ['Michael', 'Bob', 'Tracy']
scores = [95, 75, 85]
给定一个名字,要查找对应的成绩,就先要在names中找到对应的位置,再从scores取出对应的成绩,list越长,耗时越长。
如果用dict实现,只需要一个“名字”-“成绩”的对照表,直接根据名字查找成绩,无论这个表有多大,查找速度都不会变慢。用Python写一个dict如下:
d = {'Michael': 95, 'Bob': 75, 'Tracy': 85}
d['Michael'] >>> 输出:95
把数据放入dict的方法,除了初始化时指定外,还可以通过key放入:
d['Adam']=67
如果key不存在,dict就会报错。
要避免key不存在的错误,有两种办法,一是通过in判断key是否存在:
'Thomas' in d
二是通过dict提供的get()方法,如果key不存在,可以返回None,或者自己指定的value:
d.get('Thomas')
d.get('Thomas',-1)
注意:返回None的时候Python的交互环境不显示结果。
-
和list比较,dict有以下几个特点:
-
查找和插入的速度极快,不会随着key的增加而变慢;
-
需要占用大量的内存,内存浪费多。
-
而list相反:
-
查找和插入的时间随着元素的增加而增加;
-
占用空间小,浪费内存很少。
dict可以用在需要高速查找的很多地方,在Python代码中几乎无处不在,正确使用dict非常重要,需要牢记的第一条就是dict的key必须是不可变对象

浙公网安备 33010602011771号