美文网首页
Python基础

Python基础

作者: bjchenli | 来源:发表于2017-03-09 11:59 被阅读0次

python转义字符:\

python用r' '表示' '默认不转义
示例:
print(r'\\\t\\')
结果:
\\\\\t\\\
python用%%来表示一个%

如果字符串内部有很多换行,用\n写在一行里不好阅读,为了简化,Python允许用'''...'''的格式表示多行内容。
示例
print('''line1 ... line2 ... line3'')
结果
line1 line2 line3
上面是在交互式命令行内输入,注意在输入多行内容时,提示符由>>>变为...,提示你可以接着上一行输入。

由于Python的字符串类型是str,在内存中以Unicode表示,一个字符对应若干个字节。如果要在网络上传输,或者保存到磁盘上,就需要把str变为以字节为单位的bytes。
Python对bytes类型的数据用带b前缀的单引号或双引号表示:
x = 'ABC'
要注意区分'ABC'和b'ABC',前者是str,后者虽然内容显示得和前者一样,但bytes的每个字符都只占用一个字节。
以Unicode表示的str通过encode()方法可以编码为指定的bytes,例如:
x = 'ABC'.encode("ascii") y = '中文'.encode('utf-8') z = '中文'.encode('ascii')//含有中文的str无法用ASCII编码,因为中文编码的范围超过了ASCII编码的范围,Python会报错。 print('x=',x, 'y=',y, )
结果:
x= b'ABC' y= b'\xe4\xb8\xad\xe6\x96\x87'
纯英文的str可以用ASCII编码为bytes,内容是一样的,含有中文的str可以用UTF-8编码为bytes。含有中文的str无法用ASCII编码,因为中文编码的范围超过了ASCII编码的范围,Python会报错。

如果我们从网络或磁盘上读取了字节流,那么读到的数据就是bytes。要把bytes变为str,就需要用decode()方法:
x = b'ABC'.decode('ascii') y = b'\xe4\xb8\xad\xe6\x96\x87'.decode('utf-8') print('x=',x, 'y=',y, )
结果:
x= ABC y= 中文

len()函数计算的是str的字符数,如果换成bytes,len()函数就计算字节数:
a = len(b'ABC') b = len('ABC') c = len(b'\xe4\xb8\xad\xe6\x96\x87') d = len('中文'.encode('utf-8')) print(a, b, c, d)
结果:
3 3 6 6
可见,1个中文字符经过UTF-8编码后通常会占用3个字节,而1个英文字符只占用1个字节。

由于Python源代码也是一个文本文件,所以,当你的源代码中包含中文的时候,在保存源代码时,就需要务必指定保存为UTF-8编码。当Python解释器读取源代码时,为了让它按UTF-8编码读取,我们通常在文件开头写上这两行:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
第一行注释是为了告诉Linux/OS X系统,这是一个Python可执行程序,Windows系统会忽略这个注释;

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

1.list

Python内置的一种数据类型是列表:list。list是一种有序的集合,可以随时添加和删除其中的元素。
比如,列出班里所有同学的名字,就可以用一个list表示:
classmates = ['chenli', 'yyy', 'haha']//方括号是list,可以更改 print(classmates)
结果:
['chenli', 'yyy', 'haha']
如果要取最后一个元素,除了计算索引位置外,还可以用-1做索引,直接获取最后一个元素:
classmates = ['chenli', 'yyy', 'haha'] print(classmates[-1])
结果:
haha
list是一个可变的有序表,所以,可以往list中追加元素到末尾:
也可以把元素插入到指定的位置,比如索引号为1的位置:
要删除list末尾的元素,用pop()方法:
要删除指定位置的元素,用pop(i)方法,其中i是索引位置:
示例:
classmates = ['chenli', 'yyy', 'haha'] print(classmates) x = len(classmates) print(x) classmates.append('wangwu')//在list末尾追加元素 print(classmates) classmates.insert(1, 'zhangsan')//在list指定位置增加元素 print(classmates) classmates.pop()//删除list末尾的元素 print(classmates) classmates.pop(2)//删除list指定位置的元素 print(classmates)
结果:
['chenli', 'yyy', 'haha'] 3 ['chenli', 'yyy', 'haha', 'wangwu'] ['chenli', 'zhangsan', 'yyy', 'haha', 'wangwu'] ['chenli', 'zhangsan', 'yyy', 'haha'] ['chenli', 'zhangsan', 'haha']
list元素也可以是另一个list,比如:
classmates = ['chenli', 'yyy', 'haha'] print(classmates) a = ['hh', classmates, 'dayouzi'] print(a)
结果:
['chenli', 'yyy', 'haha'] ['hh', ['chenli', 'yyy', 'haha'], 'dayouzi']
要拿到'yyy'可以写classmates[1]或者a[1][1],因此s可以看成是一个二维数组,类似的还有三维、四维……数组,不过很少用到。
示例:
[chenli', 'yyy', 'haha'] yyy yyy

2、tuple

另一种有序列表叫元组:tuple。tuple和list非常类似,但是tuple一旦初始化就不能修改,比如同样是列出同学的名字:
classmates = ('chenli', 'yyy', 'haha')//圆括号是tuple,不能更改 print(classmates)
结果:
('chenli', 'yyy', 'haha')
现在,classmates这个tuple不能变了,它也没有append(),insert()这样的方法。其他获取元素的方法和list是一样的,你可以正常地使用classmates[0],classmates[-1],但不能赋值成另外的元素。
不可变的tuple有什么意义?因为tuple不可变,所以代码更安全。如果可能,能用tuple代替list就尽量用tuple。
但是,要定义一个只有1个元素的tuple,如果你这么定义:
a = (1) print(a)
结果:
1
这里的1是数字1,不是定义的tuple。要是定义只有一个元素的tuple,应该在元素后面加一个逗号,防止歧义。
a = (1,) print(a)
结果:
(1,)
最后来看一个“可变的”tuple:
t = ('a', 'b', ['A', 'B']) print(t) t[2][0] = 'X' t[2][1] = 'Y' print(t)
结果:
('a', 'b', ['A', 'B']) ('a', 'b', ['X', 'Y'])
这个tuple定义的时候有3个元素,分别是'a','b'和一个list。不是说tuple一旦定义后就不可变了吗?怎么后来又变了?
别急,我们先看看定义的时候tuple包含的3个元素:

tuple-0
当我们把list的元素'A'和'B'修改为'X'和'Y'后,tuple变为:
tuple-1
表面上看,tuple的元素确实变了,但其实变的不是tuple的元素,而是list的元素。tuple一开始指向的list并没有改成别的list,所以,tuple所谓的“不变”是说,tuple的每个元素,指向永远不变。即指向'a',就不能改成指向'b',指向一个list,就不能改成指向其他对象,但指向的这个list本身是可变的!
理解了“指向不变”后,要创建一个内容也不变的tuple怎么做?那就必须保证tuple的每一个元素本身也不能变。
3、条件判断

if <条件判断1>: <执行1> elif <条件判断2>: <执行2> elif <条件判断3>: <执行3> else: <执行4>

if语句执行有个特点,它是从上往下判断,如果在某个判断上是True,把该判断对应的语句执行后,就忽略掉剩下的elif和else,所以,请测试并解释为什么下面的程序打印的是teenager:
age = 20 if age >= 6: print('teenager') elif age >= 18: print('adult') else: print('kid')
结果:
teenager
if判断条件还可以简写,比如写:
x = 20 if x: print(True)
结果:
True
input()返回的数据类型是str,str不能直接和整数比较,必须先把str转换成整数。Python提供了int()函数来完成这件事情:
只要x是非零数值、非空字符串、非空list等,就判断为True,否则为False。

3、循环

python有两种循环,第一种是for...in 循环,依次把list或tuple中的每个元素迭代出来。
sum = 0 for x in list(range(101)): sum += x print(sum)
结果:
5050
如果要计算1-100的整数之和,从1写到100有点困难,幸好Python提供一个range()函数,可以生成一个整数序列,再通过list()函数可以转换为list。比如range(5)生成的序列是从0开始小于5的整数。
第二种循环是while循环,只要条件满足,就不断循环,条件不满足时退出循环。
total = 0 n = 100 while n > 0: total += n n = n - 1 print(total)
结果:
5050

4、dict
Python内置了字典:dict的支持,dict全称dictionary,在其他语言中也称为map,使用键-值(key-value)存储,具有极快的查找速度。

要避免key不存在的错误,有两种办法,一是通过in判断key是否存在:
二是通过dict提供的get方法,如果key不存在,可以返回None,或者自己指定的value:
# -*- coding: utf-8 -*- d = {'chenli': 90, 'HAH': 80, 'YYU': 99} print(d['YYU']) print('wangwu' in d) print(d.get('wangwu', -1))
结果:
99 False -1
要删除一个key,用pop(key)方法,对应的value也会从dict中删除:
# -*- coding: utf-8 -*- d = {'chenli': 90, 'HAH': 80, 'YYU': 99} print(d) d.pop('chenli') print(d)

结果:
{'chenli': 90, 'HAH': 80, 'YYU': 99} {'HAH': 80, 'YYU': 99}
请务必注意,dict内部存放的顺序和key放入的顺序是没有关系的。

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

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

而list相反:

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

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

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

5、set

set和dict类似,也是一组key的集合,但不存储value。由于key不能重复,所以,在set中,没有重复的key。
要创建一个set,需要提供一个list作为输入集合:
# -*- coding: utf-8 -*- s = set([1, 2, 3]) print(s)
结果:
{1, 2, 3}
注意,传入的参数[1, 2, 3]是一个list,而显示的{1, 2, 3}只是告诉你这个set内部有1,2,3这3个元素,显示的顺序也不表示set是有序的。。
重复元素在set中自动被过滤:
# -*- coding: utf-8 -*- s = set([1, 2, 3, 3, 4, 2]) print(s)
结果:
{1, 2, 3, 4}
通过add(key)方法可以添加元素到set中,可以重复添加,但不会有效果:
通过remove(key)方法可以删除元素:
set可以看成数学意义上的无序和无重复元素的集合,因此,两个set可以做数学意义上的交集、并集等操作:
# -*- coding: utf-8 -*- s = set([1, 2, 3, 3, 4, 2]) s1 = set([1, 2, 3, ]) print(s) s.add(6) print(s) s.remove(3) print(s) s2 = s print(s1 & s2) print(s1 | s2)
结果:
{1, 2, 3, 4} {1, 2, 3, 4, 6} {1, 2, 4, 6} {1, 2} {1, 2, 3, 4, 6}

相关文章

网友评论

      本文标题:Python基础

      本文链接:https://www.haomeiwen.com/subject/xzsbgttx.html