本节内容:
- 列表、元组操作
- 字符串操作
- 字典操作
- 集合操作
- 文件操作
一、列表、元组操作
1. 列表: 列表是我们使用频率最高的数据类型之一,由一个中括号 [ ]括起来,里面的值可以是任何类型(也可以是一个列表)。
列表的创建:
names = ['Island' , 'zhuzhu', 'zhu']
列表的主要使用方法有:增、删、改、查。
增:
zhu = ['a', 'b', 'c', 1, 2, [3, 'd']]
zhu1 = ['e', 'fg']
zhu.append('a zhu') #第一种方法——.append()括号内加上所要加的内容,默认加到最后一位。
print(zhu) #结果:['a', 'b', 'c', 1, 2, [3, 'd'], 'a zhu']
zhu.insert(2, 'azhu') #第二种方法——.insert() 在第2个位置前强行加入需要的内容
print(zhu) #结果:['a', 'b', 'azhu', 'c', 1, 2, [3, 'd'], 'a zhu']
zhu.extend(zhu1) #第三种方法——.extend()在zhu列表的后边扩展zhu1
print(zhu) #结果:['a', 'b', 'azhu', 'c', 1, 2, [3, 'd'], 'a zhu', 'e', 'fg']
删:
zhu = ['a', 'b', 'c', 1, 2, [3, 'd']]
zhu.remove('c') #删除指定元素
print(zhu) #结果:['a', 'b', 1, 2, [3, 'd']]
del zhu[0] #利用索引值删除指定元素
print(zhu) #结果:['b', 1, 2, [3, 'd']]
zhu.pop() #删除列表最后一个值
print(zhu) #结果:['b', 1, 2]
改:
zhu = ['a', 'b', 'c', 1, 2, [3, 'd']]
zhu[3] = '变' #利用索引值修改
print(zhu) #结果:['a', 'b', 'c', '变', 2, [3, 'd']]
查:
zhu = ['a', 'b', 'c', 1, 2, [3, 'd']]
print('zhu[1]:', zhu[1], '\nzhu[-1]:', zhu[-1]) #:利用索引值查找,索引值为负时表示倒数第n个 (\n为换行)
#结果:zhu[1]: b
# zhu[-1]: [3, 'd']
统计:
zhu = ['a', 'b', 'c', 1, 2, [3, 'd'], 'a', 2, '5']
print(zhu.count('a')) #统计元素个数
#结果:2
获取下标:
zhu = ['a', 'b', 'c', 1, 2, [3, 'd'], 'a', 2, '5']
print(zhu.index('a')) #获取下标 默认从左到右搜索找到的第一个元素,获取他的下标
#结果:0
print(zhu.index('a',2)) #获取第二个'a'的下标
#结果:6
排序和反转:
# zhu = ['a', 'b', 'c', 1, 2, [3, 'd'], 'a', 2, '5']
# zhu.sort()
# 结果:
# Traceback (most recent call last):
# File "C:/Users/48316/PycharmProjects/untitled1/zhu1/text_.py", line 2, in <module>
# zhu.sort()
# TypeError: unorderable types: int() < str() py3之后不同的数据类型不能排序
zhu = ['a', 'b', 'c', '1', '2', 'a', '2', '5']
zhu.sort() #按照ASCII码排序
print(zhu) #结果['1', '2', '2', '5', 'a', 'a', 'b', 'c']
zhu.reverse() #反转
print(zhu) #结果['c', 'b', 'a', 'a', '5', '2', '2', '1']
2.元组:元组其实跟列表差不多,也是存一组数,只不是它一旦创建,便不能再修改,所以又叫只读列表。它只有2个方法,一个是count,一个是index,完毕。
语法:
zhu = ('a', 'b', 'c', 1, 2, [3, 'd'], 'a', 2, '5') #和列表基本类似 只是用圆括号括起来
print(zhu) #结果:('a', 'b', 'c', 1, 2, [3, 'd'], 'a', 2, '5')
二、字符串操作
特性:不可修改。
各种操作:
#_author: "a zhu"
#_date: 2018/2/1
str='abcd EFGH ijk' #直接创建字符串 用引号括起来
print(str.upper()) #将字符串内所有的字符大写
#结果:ABCD EFGH IJK
print(str.casefold())#将字符串内所有的字符小写
#结果:abcd efgh ijk
print(str.capitalize())#将字符串首字母大写
#结果:Abcd efgh ijk
print(str.count(' ')) #统计字符‘ ’出现次数
#结果:2
print(str.endswith('jk'))#判断字符串是否以'jk'结尾
#结果:True
print(str.center(30,'-')) #给字符串两边加上'-',一共30个
#结果:--------abcd EFGH ijk---------
print(str.find(' ')) #找到字符' '的索引值,找不到返回-1
#结果:4
msg = "my name is {}, and age is {}."
print(msg.format('飞天zhuzhuxia','19'))
#结果:my name is 飞天zhuzhuxia, and age is 19.
msg = "my name is {1}, and age is {0}."
print(msg.format('飞天zhuzhuxia','19'))
#结果:my name is 19, and age is 飞天zhuzhuxia.
msg = "my name is {name}, and age is {age}."
print(msg.format(age='19', name='飞天zhuzhuxia'))
#结果:my name is 飞天zhuzhuxia, and age is 19.
print(msg.partition('is')) #从'is'出断开 变为三个元素组成的元组
#结果:('my name ', 'is', ' {name}, and age is {age}.')
print(str.ljust(20,'-'))
#结果:abcd EFGH ijk-------
print(str.rjust(20,'-'))
#结果:-------abcd EFGH ijk
三、字典操作
字典一种key - value 的数据类型,使用就像我们上学用的字典,通过笔划、字母来查对应页的详细内容。
字典的特性:
- dict是无序的
- key必须是唯一的,so 天生去重
字典的创建:
dict ={
'shannxi': 'xian',
'sichuan': 'chengdou',
'hunan': 'zhengzhou',
'shanxi': 'taiyuan',
'beijing': 'sanlitun'
} #字典由一对一对的键值对组成
字典的增、删、改、查:
增加:
dict['shanghai'] = '东方明珠'#直接输入新的键值,给简直赋值就可增加
print(dict)
#结果:{'shanxi': 'taiyuan', 'hunan': 'zhengzhou', 'sichuan': 'chengdou', 'shannxi': 'xian', 'shanghai': '东方明珠', 'beijing': 'sanlitun'}
删除:
dict.pop('shanxi')
print(dict)
#结果:{'sichuan': 'chengdou', 'beijing': 'sanlitun', 'shannxi': 'xian', 'hunan': 'zhengzhou'}
del dict['sichuan']
print(dict)
#结果:{'beijing': 'sanlitun', 'shannxi': 'xian', 'hunan': 'zhengzhou'}
dict.popitem()#随机删除
print(dict)
#结果:{'beijing': 'sanlitun', 'hunan': 'zhengzhou'}
修改:
dict['beijing'] = 'chaoyang' #利用键值进行修改
print(dict) #结果:{'beijing': 'chaoyang', 'hunan': 'zhengzhou', 'sichuan': 'chengdou', 'shanxi': 'taiyuan', 'shannxi': 'xian'}
查看:
print(dict['shanxi']) #利用键值可以查看 但是如果没有该键值就会报错
#结果:taiyuan
print(dict.get('sichuan1'))#这样就不会报错 如果没有就会返回None
其他:
print(dict.values())
#结果:dict_values(['xian', 'zhengzhou', 'chengdou', 'taiyuan', 'sanlitun'])
print(dict.keys())
#结果:dict_keys(['beijing', 'hunan', 'sichuan', 'shanxi', 'shannxi'])
b = {1: 2, 3: 4}
dict.update(b)
print(dict)
#结果:{1: 2, 'sichuan': 'chengdou', 3: 4, 'shanxi': 'taiyuan', 'hunan': 'zhengzhou', 'shannxi': 'xian', 'beijing': 'sanlitun'}
循环dict:
for key in dict:
print(key,dict[key])
'''hunan zhengzhou
shannxi xian
beijing sanlitun
shanxi taiyuan
sichuan chengdou'''
for k,v in dict.items(): #会先把dict转成list,数据里大时莫用
print(k,v)
'''hunan zhengzhou
shannxi xian
shanxi taiyuan
beijing sanlitun
sichuan chengdou'''
四、集合操作
集合是一个无序的,不重复的数据组合,它的主要作用如下:
- 去重,把一个列表变成集合,就自动去重了
- 关系测试,测试两组数据之前的交集、差集、并集等关系
各种使用方法:
s = set([3, 5, 9, 10]) # 创建一个数值集合
t = set("Hello") # 创建一个唯一字符的集合
t.add('c') #添加元素
print(t) #结果:{'H', 'c', 'e', 'l', 'o'}
s.update([10,37,42]) # 在s中添加多项
print(s) #结果:{3, 37, 5, 9, 10, 42}
t.remove('H') #删除指定元素
print(t) #结果:{'c', 'e', 'l', 'o'}
print(len(s)) #set的长度
#结果:6
print('x' in s) #测试x是否是s的成员
#结果:False
print('x' not in s ) #测试x是否不是s的成员
#结果:True
print(s.issubset(t)) #结果:False
#s <= t 测试是否s中的每一个元素都在t中
print(s.issuperset(t))#结果:False
#s >= t #测试是否t中的每一个元素都在s中
print(s.union(t)) #结果:{'e', 3, 42, 37, 5, 'l', 'c', 9, 10, 'o'}
#s | t 返回一个新的set包含s和t中的每一个元素
print(s.intersection(t))#结果:set()
#s & t 返回一个新的set包含s和t中的公共元素
print(s.difference(t))#结果:{3, 5, 37, 9, 10, 42}
#s - t 返回一个新的set包含s中有但是t中没有的元素
print(s.symmetric_difference(t))#结果:{'l', 3, 37, 5, 9, 10, 42, 'e', 'c', 'o'}
#s ^ t 返回一个新的set包含s和t中不重复的元素
五、文件操作
对文件操作流程
- 打开文件,得到文件句柄并赋值给一个变量
- 通过句柄对文件进行操作
- 关闭文件
现在有一个word文件如下:
纤云弄巧,飞星传恨,银汉迢迢暗度。
金风玉露一相逢,便胜却人间无数。
柔情似水,佳期如梦,忍顾鹊桥归路。
两情若是久长时,又岂在朝朝暮暮。
f = open('鹊桥仙') #打开文件
data=f.read()#获取文件内容
f.close() #关闭文件
注意 if in the win,hello文件是utf8保存的,打开文件时open函数是通过操作系统打开的文件,而win操作系统
默认的是gbk编码,所以直接打开会乱码,需要f=open('hello',encoding='utf8'),hello文件如果是gbk保存的,则直接打开即可。
三种最基本的文件打开模式:
# f = open('鹊桥仙2','r') #打开文件 只读
# f = open('鹊桥仙2','w') #打开文件 只写
# f = open('鹊桥仙2','a') #打开文件 追加
#如果系统找不到要打开的文件名,则会创建一个文件。
集体操作:
f = open('鹊桥仙') #打开文件
# data1=f.read()#获取文件内容
# data2=f.read()#获取文件内容
#
# print(data1)
# print('...',data2)
# data=f.read(5)#获取文件内容
# data=f.readline()
# data=f.readline()
# print(f.__iter__().__next__())
# for i in range(5):
# print(f.readline())
# data=f.readlines()
# for line in f.readlines():
# print(line)
# 问题来了:打印所有行,另外第3行后面加上:'end 3'
# for index,line in enumerate(f.readlines()):
# if index==2:
# line=''.join([line.strip(),'end 3'])
# print(line.strip())
#切记:以后我们一定都用下面这种
# count=0
# for line in f:
# if count==3:
# line=''.join([line.strip(),'end 3'])
# print(line.strip())
# count+=1
# print(f.tell())
# print(f.readline())
# print(f.tell())#tell对于英文字符就是占一个,中文字符占三个,区分与read()的不同.
# print(f.read(5))#一个中文占三个字符
# print(f.tell())
# f.seek(0)
# print(f.read(6))#read后不管是中文字符还是英文字符,都统一算一个单位,read(6),此刻就读了6个中文字符
#terminal上操作:
f = open('鹊桥仙2','w')
# f.write('hello \n')
# f.flush()
# f.write('world')
# 应用:进度条
# import time,sys
# for i in range(30):
# sys.stdout.write("*")
# # sys.stdout.flush()
# time.sleep(0.1)
# f = open('鹊桥仙2','w')
# f.truncate()#全部截断
# f.truncate(5)#全部截断
# print(f.isatty())
# print(f.seekable())
# print(f.readable())
f.close() #关闭文件
其他的文件模式:
# f = open('鹊桥仙2','w') #打开文件
# f = open('鹊桥仙2','a') #打开文件
# f.write('莫等闲1\n')
# f.write('白了少年头2\n')
# f.write('空悲切!3')
# f.close()
#r+,w+模式
# f = open('鹊桥仙2','r+') #以读写模式打开文件
# print(f.read(5))#可读
# f.write('hello')
# print('------')
# print(f.read())
# f = open('鹊桥仙2','w+') #以写读模式打开文件
# print(f.read(5))#什么都没有,因为先格式化了文本
# f.write('hello alex')
# print(f.read())#还是read不到
# f.seek(0)
# print(f.read())
#w+与a+的区别在于是否在开始覆盖整个文件
# ok,重点来了,我要给文本第三行后面加一行内容:'hello 岳飞!'
# 大家会说,前面不是做过修改了吗? 大哥,刚才是修改内容后print,现在是对文件进行修改!!!
# f = open('鹊桥仙2','r+') #以写读模式打开文件
# f.readline()
# f.readline()
# f.readline()
# print(f.tell())
# f.write('hello 岳飞')
# f.close()
# 和想的不一样,不管事!那涉及到文件修改怎么办呢?
# f_read = open('小重山','r') #以写读模式打开文件
# f_write = open('小重山_back','w') #以写读模式打开文件
# count=0
# for line in f_read:
# if count==3:
# f_write.write('hello,岳飞\n')
#
# else:
# f_write.write(line)
# another way:
# if count==3:
#
# line='hello,岳飞2\n'
# f_write.write(line)
# count+=1
文件操作还有许多小点就不一一列举了。
面试题小分享:
11.python的最大递归层数是多少?
999
12.求结果
v1 = 1 or 3
#v1=1
v2 = 1 and 3
#v2=3
v3 = 0 and 2 and 1 #v3 = 0
v4 = 0 and 2 or 1 #v4 = 1
v5 = 0 and 2 or 1 or 4 #v5 = 1
v6 = 0 or Flase and 1 #v6=0#a=10 b=20
and
x and y
布尔"与" - 如果 x 为 False,x and y 返回 False,否则它返回 y 的计算值。
(a and b) 返回 20。
or
x or y
布尔"或" - 如果 x 是非 0,它返回 x 的值,否则它返回 y 的计算值。
(a or b) 返回 10。
not
not x
布尔"非" - 如果 x 为 True,返回 False 。如果 x 为 False,它返回 True。
not(a and b) 返回 False
#python具体的运算符的用法请参考:http://www.runoob.com/python/python-operators.html
13.ascii、unicode、utf-8、gbk的区别?
简单说一下吧:
ascii 是最早美国用的标准信息交换码,把所有的字母的大小写,各种符号用 二进制来表示,共有256中,加入些拉丁文等字符,1bytes代表一个字符,
Unicode是为了统一世界各国语言的不用,统一用2个bytes代表一个字符,可以表达2**16=65556个,称为万国语言,特点:速度快,但浪费空间,可以用在内存处理中,兼容了utf-8,gbk,ASCII,
utf-8 为了改变Unicode的这种缺点,规定1个英文字符用1个字节表示,1个中文字符用3个字节表示,特点;节省空间,速度慢,用在硬盘数据传输,网络数据传输,相比硬盘和网络速度,体现不出来的,
gbk 是中文的字符编码,用2个字节代表一个字符,
14.字节码和机器码的区别?
简单来说:
机器码:是电脑CPU直接读取运行的机器指令,运行速度最快,但是非常晦涩难懂,也比较难编写,一般从业人员接触不到。
字节码:是一种中间状态(中间码)的二进制代码(文件)。需要直译器转译后才能成为机器码。
View Code
15.三元运算规则以及应用场景?
#先说下三元运算符的表达式:
#为真时的结果 if 判定条件 else 为假时的结果
#事例
1 if 3>2 else 0 #输出:1
View Code
16.列举 Python2和Python3的区别?
1.print 函数
2.Unicode
3.除法运算
4.异常处理
5.xrange
6.不等运算符
7.去掉了repr表达式
8.多个模块被改名(根据PEP8)
9.数据类型
详细请看:http://www.runoob.com/python/python-2x-3x.html 或者:https://www.cnblogs.com/weikunzz/p/6857971.html
17.用一行代码实现数值交换:a=1 , b=2
a, b = b, a
18.Python3和Python2中 int 和 long的区别?
int(符号整数):通常被称为是整数或整数,没有小数点的正或负整数。
long(长整数):或渴望,无限大小的整数,这样写整数和一个大写或小写的L。
float(浮点实际值):彩车,代表实数,小数除以整数部分和小数部分的书面。花车也可能是在科学记数法与E或指示的10次方é(2.5e2= 2.5×102=250)。
complex (复数):+ BJ的形式,其中a,b是彩车和J(或J)表示-1的平方根(这是一个虚数)。 a是真正的数字部分,b是虚部。复数不使用Python编程。
19.xrange和range的区别?
#range
#函数说明:range([start,] stop[, step]),根据start与stop指定的范围以及step设定的步长,生成一个列表。
#eg:
range(10)
#输出[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
range(2,10)
#输出[2, 3, 4, 5, 6, 7, 8, 9]
range(2,10,2)
#输出[2, 4, 6, 8]
type(_)
#输出<type 'list'>
#xrange
#函数说明:和range 的用法完全相同,但是返回的是一个生成器。
#eg:
xrange(10)
#输出xrange(10)
xrange(2,10)
#输出xrange(2, 10)
xrange(2,10,2)
#输出xrange(2, 10, 2)
type(_)
#输出<type 'xrange'>
list(xrange(2, 10, 2))
#输出[2, 4, 6, 8]
#但是要生成很大的数字序列的时候,用xrange会比range性能优很多,因为不需要一上来就开辟一块很大的内存空间,这两个基本上都是在循环的时候用。
View Code
20.文件操作时:xreadlines和readlines的区别?
* readline() >> reads a single line from file with newline at the end。
readline()读取一行内容,放到一个字符串变量,返回str类型。
* readlines() >> returns a list containing all the lines in the file
readlines() 读取文件所有内容,按行为单位放到一个列表中,返回list类型。
* xreadlines() >> Returns a generator to loop over every single line in the file
返回一个生成器,来循环操作文件的每一行。循环使用时和readlines基本一样,但是直接打印就不同
View Code
n
x and y
布尔"与" - 如果 x 为 False,x and y 返回 False,否则它返回 y 的计算值。
(a and b) 返回 20。