pyc文件
一、解释型语言与编译型语言
1、前景提要
计算机是不能够识别高级语言(PHP、python、Java等汇编语言),所以当我们运行一个高级语言程序的时候,就需要一个“翻译机”来从事把高级语言转变成计算机能读懂的机器语言的过程。这个过程分成两类,第一种是编译,第二种是解释。
2、解释型语言
语言类型:JavaScript、VBScript、Perl、Ruby、MATLAB 等大部分的汇编语言
实现过程:没有编译的过程,通过解释器对程序逐行进行翻译,然后直接进行运行,最典型的例子就是:Ruby
3、编译型语言
语言类型:C/C++、Pascal/Object Pascal(Delphi)等编译语言
实现过程:先通过编译器对程序执行一个编译的过程,把程序转变成机器语言。运行时就不需要翻译,而直接执行就可以了。最典型的例子就是C语言。
4、二者之间的区别
编译型语言在程序运行之前就已经对程序做出了“翻译”,所以在运行时就少掉了“翻译”的过程,所以效率比较高
5、编译-解释型语言:java
Java首先是通过编译器编译成字节码文件,然后在运行时通过解释器给解释成机器文件。所以我们说Java是一种先编译后解释的语言
二、python是什么?——》编译-解释语言
1、过程
先编译成VM识别的字节码,然后再由VM去解释执行。即先编译后解释执行
2、详细解释
其实python和Java/C#一样,也是一门基于虚拟机的语言,我们先来从表面上简单地了解一下python程序的运行过程吧。
当我们在命令行中输入python hello.py时,其实是激活了python的“解释器”,告诉“解释器”:你要开始工作了。可是在“解释”之前,其实执行的第一行工作和Java一样,是编译。
熟悉Java的同学可以想一下我们在命令行中如何执行一个Java的程序。
java hello.java
java hello
只是我们在用Eclipse之类的IDE时,将这两部给融合成了一部而已。其实python也一样,当我们执行python hello.py时,他也一样执行了这么一个过程,所以我们应该这样来描述python,python是一门先编译后解释的语言。
三、python的运行流程
1、PyCodeObject文件
当python程序运行时,编译的结果则是保存在位于内存中的PyCodeObject中,当python程序运行结束时,python解释器则将PyCodeObject写回到pyc文件中。
2、pyc文件
当python程序第二次运行时,首先程序会在硬盘中寻找pyc文件,如果找到,则直接载入,否则就重复上面的过程。
3、总结
我们在硬盘上看到的pyc自然不必多说,而其实PyCodeObject则是python编译器真正编译成的结果。所以我们这样来定位PyCodeObject和pyc文件,我们说pyc文件其实是PyCodeObject的一种持久化保存方式。
四、解释型语言与编译型语言的区别
1、解释型语言
跟外国人沟通的时候,翻译员一句一句的将交谈的对话一句一句翻译给外国人听
2、编译型语言
跟外国人沟通的时候,直接先将中文文件翻译成英文的再交给他,这样他看到的就全部都是英文文件
执行test.py文件的时候,生成的时候auth.pyc的文件,模块被别人导入的程序,运行的时候就会生成pyc文件,用test导入auth模块,生成一个auth.pyc文件之后,如果后面在auth.py文件中修改了代码的话,在下次运行的过程中,会比较auth.py跟auth.pyc修改时间的对比,如果.py的修改时间比较新的话就会重新编译生成一个新的.pyc文件,更新到之前的.pyc文件中
五、pyc文件
编写auth.py模块,新建test.py文件引用auth.py文件--运行test.py文件之后会生成auth.pyc文件
不同版本的区别
python2:生成的__pycache__ 文件夹、ahtu.pyc文件
python3:生成的pyc文件,名称修改为:auth.cpython-35.pyc,并且是直接在__pycache__ 文件夹里面的
数字
一、特性
1、解析
在python语言里面,如果声明变量的话是不需要规定变量的类型的(整形、字符串),这是python的特性,在其他编程语言中就需要进行定义变量的类型哦
2、相关举例
#C语言 int age 18 long age 22 str name 'alex' #python age = 18 2**31
二、int类型(整形)
1、例子
2、3、4、5、6
2、图解
三、long型(长整形)
四、float(浮点型)
五、complex(复数)
布尔值
一、定义
只有0跟1有False跟True,其他数字不能用True和False来判断
1、0 = False
2、1 = True
二、图解
字符串
一、创建字符串
1、相关代码
r = 'haha' print(r) 或 r =str('haha') print(r)
2、相应的格式
"hello world"
二、字符串拼接
1、方法
每次创建字符串时候需要在内存中开辟一块连续空间,如果修改了字符串的话,就会再继续开辟一块空间
#占用一块内存空间 name = 'haha' print('i am %s' % name)
拼接字符串:用+号进行拼接的字符串,表示+号每出现一次的话就会重新在内存中开启一块空间,1+加号的数目 = 占用的内存块
#占用3个内存空间 name = 'hahahha' print('my name is'+ name +'and you?')
2、拼接:+
#占用3个内存空间 name = 'hahahha' print('my name is'+ name +'and you?')
三、字符串格式化输出
1、代码
name = 'haha' print('i am %s' % name) #打印出来:i am haha
2、解析
%s:字符串
%d:整数
%f:浮点数
四、基本操作类型
1、移除空白--strip()
1.1、背景
在输入的内容中,需要前面或者后面多输入了空格的话,就不会进行打印。利用strip方法来进行预防出现这种情况
1.2、代码
username = input('user:') if username == 'monkey': print('welcome') #如果输入user: monkey (前面或者后面有空格),就不会执行下面的print语句 #结果:user:monkey (后面多加了一个空格) 没有打印出来welcome
username = input('user:') if username.strip() == 'monkey': print('welcome') #结果: #user:monkey (输入的内容后面包含空格) #welcome
1.3、默认脱掉
脱掉空格、换行、tab健
1.4、指定脱掉
strip('/n') :指定脱掉换行
2、分割--split()
2.1、解析
将字符串中的元素分隔开成一个列表
2.2、代码
#字符串中没有用逗号隔开(表示只有一个元素) username = "alex" name = username.split(',') print(name) #结果: #['alex'] #正确的解法 username = "a,l,e,x" name = username.split(',') print(name) #结果: #['a', 'l', 'e', 'x']
#利用.分隔开
username = "a.lex"
name = username.split('.')
print(name)
#结果:
['a', 'lex']
3、组合--"|".join
3.1、解析
将其他形式的数据组合成字符串
3.2、代码
name = "haha,hehe,dddd,iiiii" name2 = name.split(",") print(name2) print("|".join(name2))
print("".join(name2))
#结果:
#['haha', 'hehe', 'dddd', 'iiiii'] 分割字符串为列表
#haha|hehe|dddd|iiiii 将分割完之后的列表以|再次组合成字符串
#hahaheheddddiiiii 将分割完之后的列表再次组合成字符串
4、首个字母大写(每个字符串的首字母大写)--capitalize()
name = 'a tang a' print(name.capitalize()) #结果:A tang a
5、字符串格式化
5.1、%S 字符串格式化输出
#1、单个字符串 name = 'haha' print('i am %s' % name) #打印出来:i am haha #%s:字符串 %d: 整数 %f:浮点数 #2、多个字符串 name = ['wangdaha','wangerha',9,'wangsanha','wangsiha','wangxiaoxiao',9,'lidada','lixiaoer',9,99,9,999] if 9 in name: num_of_ele = name.count(9) position_of_ele = name.index(9) print('[%s] 9 is/are in name,position:[%s]' %(num_of_ele,position_of_ele)) #结果:[4] 9 is/are in name,position:[2]
5.2、format()方法
msg = 'Hello,my name is {name},i am {age} old' msg2 = msg.format(name = 'tangtang',age = 20) print(msg2) #结果: #Hello,my name is tangtang,i am 20 old
5.3、按照索引值来赋值
解析
索引值必须按照0、1、2、3....来进行排序,如果没有对应的索引值就会报错:IndexError: tuple index out of range
代码
msg = 'Hello,my name is {0},i am {1} old' msg2 = msg.format('tangtang',20) print(msg2) #结果: #Hello,my name is tangtang,i am 20 old msg = 'Hello,my name is {0},i am {4} old' msg2 = msg.format('tangtang',20) print(msg2) #结果:索引值4超过范围 #IndexError: tuple index out of range
6、切片
6.1、解析
[8:11]中从0开始算,并且是包括其中的空格,范围为第8、9、10位,不包括第11位
6.2、相关代码
msg = 'Hello,my name is {0},i am {1} old' msg2 = msg.format('tangtang',20) print(msg2[8:11]) #结果:8是空格,所以显示为空格 # na
7、长度填充--center()
7.1、解析
如下代码,40表示的是长度,welcome不够40个字符,所以用-从中间开始进行填充。
7.2、相关代码
name = 'welcome' print(name.center(40,'-')) #结果: #----------------welcome-----------------
8、查找--find()
8.1、相关解析
如果在搜索的时候存在相同的字符的话,就打印出来遇到的第一个字符的索引值
如果查找不到相对应的字符,打印出来的字符索引值为-1
8.2、相关代码
name = 'tangtang' print(name.find('g')) print(name.find('z')) #结果: #3 #有对应的字符串的话打印出相对应第一个字符的索引值 #-1 #查找不到相对应的字符的话就报-1
9、类型的转换
9.1、input输入默认的是字符串,如果输入的是数字的话,需要强制转换成int类型
#强制转换成int类型,输入字符串 age = int(input("input your age:")) print('your age is:%s' %age) #结果: #输入得是数字 #input your age:45 #your age is:45 #输入的是非数字 #ValueError: invalid literal for int() with base 10: 'fffff'
9.2、isdigit()--通过if来判断输入的是否是字符串或者是数字
#通过if判断输入的是int类型,如果是int类型,直接强制转换成int;如果是字符串类型就按照字符串类型输出 age = input('input your age:') if age.isdigit(): age = int(age) print('welcome') else: print("invalid data type") #结果: #输入的是数字 # input your age:345 #welcome #输入的是非数字 #invalid data type
9.3、isalnum()方法
不能有特殊字符,可以有数字跟字母的组合
输入得是数字、字母、中文返回的是True;输入的是特殊字符、符号,返回的是False
name = input("input your name:") print(name.isalnum()) #结果: #输入得是数字、字母、中文返回的是True;输入的是特殊字符、符号,返回的是False #input your name:4饿 #True #input your name:3453434%% #False
10、判断是否以xx结尾--endswith()
在endswith()方法中加入的参数必须是字符串的格式,即使输入的数字也需要加""来转换成字符串格式。
如果输入的数字是非字符串格式的话,会报:SyntaxError: invalid token
存在为True、不存在为False
#数字--存在 name = "sijiojdo43904309" print(name.endswith('09')) #结果: #True #endswith(),加的参数必须是字符串格式,输入数字的话也需要加引号,当成字符串格式输入 #不存在的字符串 #数字 name = "sijiojdo43904309" print(name.endswith('5d')) #结果: #False
11、判断是否以xx开始--startswith()
在startswith()方法中加入的参数必须是字符串的格式,即使输入的数字也需要加""来转换成字符串格式。
如果输入的数字是非字符串格式的话,会报:SyntaxError: invalid token
存在为True、不存在为False
#存在的字符串 name = "sijiojdo43904309" print(name.startswith('si')) #结果: #True #endswith(),加的参数必须是字符串格式,输入数字的话也需要加引号,当成字符串格式输入 #不存在的字符串 #数字 name = "sijiojdo43904309" print(name.startswith('5d')) #结果: #False
12、字符串全部大写--upper()
只能是全部字符串全部大写,不能切片选择部分的字符串进行大写。
name = "sijiojdo43904309" print(name.upper()) #结果: #SIJIOJDO43904309 name = "sijiojdo43904309" print(name.upper('si')) #结果: #TypeError: upper() takes no arguments (1 given) #部分字符串大写,或者不存在的字符串大写
13、字符串全部小写--lower()
name = "SIJIOJDO43904309" print(name.lower()) #结果: #sijiojdo43904309
14、长度--len()
15、索引--index()
列表
一、创建列表
1、相关代码
name_list = ['wangdaha','wangerha','wangsanha','wangsiha'] 或 name_list = list(['wangdaha','wangerha','wangsanha','wangsiha'])
2、格式
list = ['参数1',‘参数2’,3,4,5]
或
list = list( ['参数1',‘参数2’,3,4,5])
二、相关名词定义
1、同一个变量存储多个数据
通过变量来存储多个数据的话,读取的时候只能读取全部的数据,不能取出个别的数据
name = "wangdaha,wangerha,wangsanha,wangsiha,......." print(name) #打印结果 #wangdaha,wangerha,wangsanha,wangsiha,.......
2、多个变量存储多个数据
需要变量与定义的数值一一对应的时候才可以正确的查询到相对应要查询到的数据(不现实,没有达到想要查询的目的)
如果没有达到对应的数值的话,会报:ValueError: not enough values to unpack (expected 5, got 4)
name1,name2,name3,name4='wangdaha','wangerha','wangsanha','wangsiha' print(name1) #打印结果 #wangdaha
3、为何会有列表?
由于上面的1、2两点,通过变量来存储多个数据,会存在不现实的情况,所以发明了“列表”(list)【只有在python中才称作为列表,其他语言中为数组】
4、如何定义变量和数字?
列表中定义数字,不需要引号,直接写入存储的数值即可。
定义变量需要先定义,再直接引用定义好的变量
5、列表格式
一个中括号开始,另一个中括号结束
6、什么是元素?
列表中的每一个值称之为元素
7、什么是索引值?
列表里面可以存储任何的数值(字符串、变量、数字等),并且数值之间用逗号进行隔开
索引值就是表示元素的位置,都是从0开始计算的
name = ['wangdaha','wangerha','wangsanha','wangsiha'] age = 8 name = ['wangdaha','wangerha','wangsanha','wangsiha',34,age] print(name) name1 = name[2] name2 = name[0] name3 = name[1] print(name1,name2,name3) #打印结果: # ['wangdaha', 'wangerha', 'wangsanha', 'wangsiha', 34, 8] --》对应print(name) #wangsanha wangdaha wangerha ---》对应printprint(name1,name2,name3)
三、相关操作
1、根据索引值取元素
1.1、取最后一个索引
name = ['wangdaha','wangerha','wangsanha','wangsiha'] age = 8 name = ['wangdaha','wangerha','wangsanha','wangsiha',34,age] name1 = name[-1] print(name1) #打印结果: # 8
1.2、切片(一次性取多个值)
顾首不顾尾(取的结果包括前面的索引值,但是不包括后面的索引值)
name = ['wangdaha','wangerha','wangsanha','wangsiha'] age = 8 name = ['wangdaha','wangerha','wangsanha','wangsiha',34,age] name1 = name[0:3] print(name1) #打印结果: # ['wangdaha', 'wangerha', 'wangsanha']--》取的是索引值分别为:0、1、2 #顾首不顾尾(取的结果包括前面的索引值,但是不包括后面的索引值)
1.3、取后面几个值
[-1:-5]:列表的开始为从列表的左边开始,从列表的右边结束,不能倒着取,只能正着取
name = ['wangdaha','wangerha','wangsanha','wangsiha'] age = 8 name = ['wangdaha','wangerha','wangsanha','wangsiha',34,age] #倒着取值 name1 = name[-1:-5] print(name1) #打印结果:[] #开始:列表的左边,结束:列表的右边,上面的写法表示的是从-1开始取,所以取不到数据,不能倒着取,只能正着取 #正确的取法 name1 = name[-5:-1] print(name1) #打印结果:['wangerha', 'wangsanha', 'wangsiha', 34]
1.4、取第一个、最后一个、全部元素
name = ['wangdaha','wangerha','wangsanha','wangsiha'] age = 8 name = ['wangdaha','wangerha','wangsanha','wangsiha',34,age] name1 = name[1:] print(name1) name2 = name[:] print(name2) print(name) name3 = name[:4] print(name3) name4 = name[0:4] print(name4) #打印结果: #['wangerha', 'wangsanha', 'wangsiha', 34, 8] 取最后几个元素 #['wangdaha', 'wangerha', 'wangsanha', 'wangsiha', 34, 8] 取全部元素 #['wangdaha', 'wangerha', 'wangsanha', 'wangsiha', 34, 8] 取全部元素 #['wangdaha', 'wangerha', 'wangsanha', 'wangsiha'] 取前面几个元素 #['wangdaha', 'wangerha', 'wangsanha', 'wangsiha'] 取前面几个元素
1.5、多次取值
name = ['wangdaha','wangerha','wangsanha','wangsiha'] age = 8 name = ['wangdaha','wangerha','wangsanha','wangsiha',34,age] name1 = name[1:] print(name1) name2 = name[1:][2:4] print(name2) name3 = name[1:][2:4][0] print(name3) name4 = name[1:][2:4][0][1] print(name4) #打印结果: #['wangerha', 'wangsanha', 'wangsiha', 34, 8] 打印所有元素 #['wangsiha', 34] 从所有元素当中取出索引值为2、3的元素 #wangsiha 从取出的索引值为2、3的元素中取出索引值为0的元素 #a 从取出的索引值为2、3的元素中取出索引值为0的元素中取出索引值为1的元素
2、修改元素值:直接取代
name = ['wangdaha','wangerha','wangsanha','wangsiha'] age = 8 name = ['wangdaha','wangerha','wangsanha','wangsiha',34,age] name[0] = "wei wangdaha" print(name) #打印结果: #['wei wangdaha', 'wangerha', 'wangsanha', 'wangsiha', 34, 8] #先找到需要修改的函数在修改
3、插入值--insert(索引值,"参数")
3.1、正数插入
name = ['wangdaha','wangerha','wangsanha','wangsiha',34] #正数插入 name.insert(2,'wang xiaoxiao') print(name) #打印结果: #['wangdaha', 'wangerha', 'wang xiaoxiao', 'wangsanha', 'wangsiha', 34] #往索引值=2的前面插入
3.2、负数插入
#负数插入
name = ['wangdaha','wangerha','wangsanha','wangsiha',34] name.insert(-2,'wang erxiao') print(name) #打印结果: #['wangdaha', 'wangerha', 'wang xiaoxiao', 'wangsanha', 'wangsiha', 'wang erxiao', 34] #索引值=-2的前面插入
4、追加--append()
只能是往最后面的一个数后面追加元素,其他位置不可以
name = ['wangdaha','wangerha','wangsanha','wangsiha',34] name.append('wang xiaoxiao') print(name) #打印结果: #['wangdaha', 'wangerha', 'wangsanha', 'wangsiha', 34, 'wang xiaoxiao'] #只能是往最后面的一个数后面追加元素,其他位置不可以
5、删除相关操作
5.1、删除-remove():只能单个删除元素
name = ['wangdaha','wangerha','wangsanha','wangsiha',34] name.remove('wangdaha') print(name) #打印结果: #['wangerha', 'wangsanha', 'wangsiha', 34] #删除掉wangdaha
5.2、多个删除--del
可以删除任何东西:变量、列表、删除内存中的数据
name = ['wangdaha','wangerha','wangsanha','wangsiha','wangxiaoxiao','lidada','lixiaoer'] del name[3:5] print(name) name1 = 'haha' del name1 print(name1) del name print(name) #打印结果: #['wangdaha', 'wangerha', 'wangsanha', 'lidada', 'lixiaoer'] 删除'wangsiha','wangxiaoxiao'(删除内存中的数据) #NameError: name 'name1' is not defined 删除变量name1 所以会提示找不到变量name1 #NameError: name 'name' is not defined删除列表name 所以会提示找不到列表name
5.3、POP删除
下标与索引值一样,是从0开始进行计算的。
name = ['wangdaha','wangerha','wangsanha','wangsiha','wangxiaoxiao','lidada','lixiaoer'] name.pop() print(name) name.pop(1) print(name) #打印结果: # ['wangdaha', 'wangerha', 'wangsanha', 'wangsiha', 'wangxiaoxiao', 'lidada'] 默认删除最后一个 #['wangdaha', 'wangsanha', 'wangsiha', 'wangxiaoxiao', 'lidada'] 删除的时候填写的是下标,remove填写的是元素
5.4、三种删除方法对比
需求
写一个列表,列表里包含本组所有成员名字
1、往中间的位置插入两个临组成员的名字
2、取出第三-第八的人列表
3、删除第7个人
4、把刚才加入的那2个其他组的人,一次性删除(remove只能一次性删除一人)
5、把组长的名字加上组长备注
6、每个一个人打印一次(步长)
思维导图
相关代码
name = ['wangdaha','wangerha','wangsanha','wangsiha','wangxiaoxiao','lidada','lixiaoer'] name.insert(3,'A') name.insert(4,'B') print(name) name1 = name[2:9] print(name1) name.remove("wangxiaoxiao") print(name) del name[3:5] print(name) name[0] = 'xiugai wangdaha' print(name) name2 = name[::2] print(name2) #打印结果: #['wangdaha', 'wangerha', 'wangsanha', 'A', 'B', 'wangsiha', 'wangxiaoxiao', 'lidada', 'lixiaoer'] 往wangsiha前面分别加入A跟B #['wangsanha', 'A', 'B', 'wangsiha', 'wangxiaoxiao', 'lidada', 'lixiaoer' 打印出来第3-8个元素 #['wangdaha', 'wangerha', 'wangsanha', 'A', 'B', 'wangsiha', 'lidada', 'lixiaoer'] 删除wangxiaoxiao #['wangdaha', 'wangerha', 'wangsanha', 'wangsiha', 'lidada', 'lixiaoer'] 删除A跟B,删除多个人 remove只能删除一个人,删除全部或者是多个人需要用del #['xiugai wangdaha', 'wangerha', 'wangsanha', 'wangsiha', 'lidada', 'lixiaoer'] 修改wangdaha为xiugai wangdaha #['xiugai wangdaha', 'wangsanha', 'lidada'] 取出全部并且步长为2的元素(隔一个取一个)
6、利用if判断查询单个元素
name = ['wangdaha','wangerha','wangsanha','wangsiha','wangxiaoxiao','lidada','lixiaoer'] if 9 in name: print('9 is in name') else: print('no') #打印结果: no
7、统计列表--count()
利用count方法来判断列表中存在9的个数
name = ['wangdaha','wangerha',9,'wangsanha','wangsiha','wangxiaoxiao',9,'lidada','lixiaoer',9,99,9,999] if 9 in name: num_of_ele = name.count(9) print( '[%s] 9 is/are in name'%num_of_ele) #打印结果: [4] 9 is/are in name
8、查找索引--index()
统计元素的元素,并且打印出来第一个元素的索引值是多少?
name = ['wangdaha','wangerha',9,'wangsanha','wangsiha','wangxiaoxiao',9,'lidada','lixiaoer',9,99,9,999] if 9 in name: num_of_ele = name.count(9) position_of_ele = name.index(9) print('[%s] 9 is/are in name,position:[%s]' %(num_of_ele,position_of_ele)) #打印结果: [4] 9 is/are in name,position:[2] #统计到name列表里面有4个9 并且第一个9的索引值=2 #count :统计次数 #index:查询第一个9的位置,查询到之后就不会在进行查询下去,直接打印出来
9、合并列表--extend()
将name2列表合并到name列表中,就是将name2列表中的元素添加在name列表的后面
name = ['wangdaha','wangerha',9,'wangsanha','wangsiha','wangxiaoxiao',9,'lidada','lixiaoer',9,99,9,999] name2 = ['haha','haha1','haha2'] name.extend(name2) print(name) #打印结果:['wangdaha', 'wangerha', 9, 'wangsanha', 'wangsiha', 'wangxiaoxiao', 9, 'lidada', 'lixiaoer', 9, 99, 9, 999, 'haha', 'haha1', 'haha2'] #name2列表追加到name列表里面,但是 name2列表还是存在的,只是复制了一个name2的值而已
10、反转操作--reverse()
name = ['wangdaha','wangerha',9,'wangsanha','wangsiha','wangxiaoxiao',9,'lidada','lixiaoer',9,99,9,999] name.reverse() print(name) #打印结果:[999, 9, 99, 9, 'lixiaoer', 'lidada', 9, 'wangxiaoxiao', 'wangsiha', 'wangsanha', 9, 'wangerha', 'wangdaha'] #将name列表中的元素倒过来显示
11、排序--sort()
#列表中的元素全部是字符串 name = ['wangdaha','wangerha','wangsanha','wangsiha','wangxiaoxiao','lidada','lixiaoer'] name.sort() print(name) #打印结果:['lidada', 'lixiaoer', 'wangdaha', 'wangerha', 'wangsanha', 'wangsiha', 'wangxiaoxiao'] #按照ascii码表中的字母顺序进行排列 #列表中的元素全部是数字 name1 = [3,3,3,5,5,6,78,7,8,8] name1.sort() print(name1) #打印结果:[3, 3, 3, 5, 5, 6, 78, 7, 8, 8] #按照数字的顺序进行排序 #列表中包含数字和字符串 name2 = ['hhah','hhahha','wsod','dsadads',8,8,9,3,2,] name2.sort() print(name2) #打印结果:TypeError: unorderable types: int() < str() #字符串跟数字不能一起排序,但是 python2中会根据ascii码表进行排序,不会报错
12、复制列表
12.1、copy:复制列表
单个列表复制
#单个列表 name = ['wangdaha','wangerha','wangsanha','wangsiha','wangxiaoxiao','lidada','lixiaoer'] name1 = name.copy() name[1] = 8 print(name) print(name1) #打印结果: # ['wangdaha', 8, 'wangsanha', 'wangsiha', 'wangxiaoxiao', 'lidada'] name列表 #['wangdaha', 'wangsanha', 'wangsiha', 'wangxiaoxiao', 'lidada'] name1列表
列表嵌套列表复制
列表中可以嵌套N个列表
修改大列表里面的元素是不会同步到copy后到列表的,但是如果是修改小列表中的元素的话,就会同步到copy后的列表中
自己创建的小列表是一个独立的内存段,大列表中的小列表只是存储了这个小列表的内存地址,小列表的内存地址指向这个大列表的而已,并不是直接是内存段
如果使用的是copy方法的话,python默认的是只copy第一层,深层的东西不进行copy,第二层数据量有可能非常大,所以只copy第一层。
小列表中这块的只是指向其他地方的内存地址。copy的只是个地址;修改的话修改的是列表指向的内存地址,地址所对应的数据并没有被copy。
#列表中嵌套列表并进行修改name列表 name = ['wangdaha','wangerha',[8,'hahk','dsdd'],'wangsanha','wangsiha','wangxiaoxiao',[8,'sad',7],'lidada','lixiaoer'] name1 = name.copy() name[1] = 8 name[2][0] = 'gg' print(name) print(name1) #打印结果: # ['wangdaha', 8, ['gg', 'hahk', 'dsdd'], 'wangsanha', 'wangsiha', 'wangxiaoxiao', [8, 'sad', 7], 'lidada', 'lixiaoer'] name列表 #['wangdaha', 'wangerha', ['gg', 'hahk', 'dsdd'], 'wangsanha', 'wangsiha', 'wangxiaoxiao', [8, 'sad', 7], 'lidada', 'lixiaoer'] name1列表
12.2、浅copy.copy()--只是做了一个软连接
与上面的copy方法一样,只是浅层的copy,原理与上面解释的原理一样,copy的小列表中的元素只是内存地址
import copy name = ['wangdaha','wangerha',[8,'hahk','dsdd'],'wangsanha','wangsiha','wangxiaoxiao',[8,'sad',7],'lidada','lixiaoer'] name1 = copy.copy(name) name[1] = 8 name[2][0] = 'gg' print(name) print(name1) #打印结果: # ['wangdaha', 8, ['gg', 'hahk', 'dsdd'], 'wangsanha', 'wangsiha', 'wangxiaoxiao', [8, 'sad', 7], 'lidada', 'lixiaoer'] name列表 #['wangdaha', 'wangerha', [gg, 'hahk', 'dsdd'], 'wangsanha', 'wangsiha', 'wangxiaoxiao', [8, 'sad', 7], 'lidada', 'lixiaoer']
12.3、深copy.deepcopy()--完全克隆一份,两个列表完全独立,修改之后的列表完全不会影响到copy的列表
import copy name = ['wangdaha','wangerha',[8,'hahk','dsdd'],'wangsanha','wangsiha','wangxiaoxiao',[8,'sad',7],'lidada','lixiaoer'] name1 = copy.deepcopy(name) name[1] = 8 name[2][0] = 'gg' print(name) print(name1) #打印结果: # ['wangdaha', 8, ['gg', 'hahk', 'dsdd'], 'wangsanha', 'wangsiha', 'wangxiaoxiao', [8, 'sad', 7], 'lidada', 'lixiaoer'] name列表 #['wangdaha', 'wangerha', [8, 'hahk', 'dsdd'], 'wangsanha', 'wangsiha', 'wangxiaoxiao', [8, 'sad', 7], 'lidada', 'lixiaoer']
13、长度--len()
name = ['wangxiaohua','wangdashu',6,9,9,80,'haha','alex',34,34,'wq',34,9,'dfd',34,9,'weew'] print("name: %s" %len(name)) #打印结果: name:17
14、修改列表中的元素
方法一
如下面代码,我们已经修改了第一个9为999了,但是在第一个打印结果中的9还是4个,第一个9的索引值还是等于2;
因为是在之前就定义为一个变量position_of_ele,然后在执行修改9的操作,而不是在num_of_ele这个变量中进行操作的,所以显示出来的一直都是。
#修改name列表中的第一个9为999 name = ['wangdaha','wangerha',9,'wangsanha','wangsiha','wangxiaoxiao',9,'lidada','lixiaoer',9,99,9,999] if 9 in name: num_of_ele = name.count(9) position_of_ele = name.index(9) name[position_of_ele] = 999 print('[%s] 9 is/are in name,position:[%s]' %(num_of_ele,position_of_ele)) print(name) #打印结果: [4] 9 is/are in name,position:[2] 统计到name列表里面有4个9 并且第一个9的索引值=2 #['wangdaha', 'wangerha', 999, 'wangsanha', 'wangsiha', 'wangxiaoxiao', 9, 'lidada', 'lixiaoer', 9, 99, 9, 999]
方法二
利用for循环,将name列表中所有的9修改为999
name = ['wangdaha','wangerha',9,'wangsanha','wangsiha','wangxiaoxiao',9,'lidada','lixiaoer',9,99,9,999] for i in range(name.count(9)): position_of_ele = name.index(9) name[position_of_ele] = 999 print(name) #打印结果: #['wangdaha', 'wangerha', 999, 'wangsanha', 'wangsiha', 'wangxiaoxiao', 9, 'lidada', 'lixiaoer', 9, 99, 9, 999] #['wangdaha', 'wangerha', 999, 'wangsanha', 'wangsiha', 'wangxiaoxiao', 999, 'lidada', 'lixiaoer', 9, 99, 9, 999] #['wangdaha', 'wangerha', 999, 'wangsanha', 'wangsiha', 'wangxiaoxiao', 999, 'lidada', 'lixiaoer', 999, 99, 9, 999] #['wangdaha', 'wangerha', 999, 'wangsanha', 'wangsiha', 'wangxiaoxiao', 999, 'lidada', 'lixiaoer', 999, 99, 999, 999] #通过count找出需要循环的次数,再找到我们需要的9当前所在的位置,返回它的索引,将9修改成我们所需要的数字,再次进行循环操作
元组
一、定义及其他
1、定义:不可变的列表
2、类型:tuple
3、元组不能进行修改,只能统计和获取数据操作而已,如果做其他的操作就会报错:TypeError: 'tuple' object is not callable
二、创建元组
ages = (11,22,33,44,55,66)
或
ages = tuple(11,22,33,44,55,66)
三、元组与列表的区别
四、相关操作
1、统计--count()
括号里面一定要填写元素,如果为空的话会报以下错误:TypeError: count() takes exactly one argument (0 given)
返回的结果为统计元素的个数,如果元素不存在的话,返回的结果是0
r = (1,2,3,4,5,5,5,5,'hah') r1 = r.count("hah") r2 = r.count(5) print(r1,r2) #运行结果:1 4 #在count(),括号里面必需填写元素,如果元素不存在的话返回0,如果元素存在的话会返回元组里面有多少个元素
2、索引--index()
2.1、特性
index(),括号里面一定要填写元素,如果为空的话会报错:TypeError: index() takes at least 1 argument (0 given)
返回结果为该元素的位置
如果有重复的元素的话,返回的永远是第一个元素的位置
如果元素不错在的话会报错:ValueError: tuple.index(x): x not in tuple
2.2、小技巧
可以通过pycharm定义一个元组,在查看全部可以使用的基本操作;两个下划线的表示的是内部的方法,我们不能使用。
2.3、应用场景
程序不想被人修改的时候(统计全部国家的一个列表,已经是一个定数了,修改的可能性不大。)
2.4、相关代码举例
r = (1,2,3,4,5,5,5,5) r1 = r.index(2) print(r1) #运行结果:1 #在index(),括号里面需要填写元素,并且返回的结果是该元素在元组当中的位置,如果有重复的元素的话,则是返回第一个元素的位置就停止了。不可为空