python学习笔记2--模块初识、数据类型、字符串、字典、列表、元组
一、模块初识
python之所以强大,是因为其背后有大量的标准库与三方库作为支持。在此先记录两个基本的模块sys模块和os模块。
标准库:python默认安装的库,不需要单独安装,直接导入使用。
三方库:第三方开发的库,需要下载安装后才能使用。
使用模块时,需要先导入该模块:
import 模块名
1、sys模块
sys.path:该方法返回python的环境变量,被加载的模块都保存在下面的位置,其中xxxx/site-packages目录下保存了三方库,起上级目录则保存了标准库。
[root@zhy ~]# python3 Python 3.5.2 (default, Jul 22 2016, 22:13:18) [GCC 4.4.7 20120313 (Red Hat 4.4.7-17)] on linux Type "help", "copyright", "credits" or "license" for more information. >>> import sys >>> sys.path ['', '/usr/local/lib/python35.zip', '/usr/local/lib/python3.5', '/usr/local/lib/python3.5/plat-linux', '/usr/local/lib/python3.5/lib-dynload', '/usr/local/lib/python3.5/site-packages'] >>>
sys.argv:该方法用于接收当前脚本的相对路径以及传递给改脚本的位置参数。
[root@zhy ~]# cat test.py #!/usr/bin/env python3 # -*- coding: UTF-8 -*- import sys print(sys.argv) [root@zhy ~]# ./test.py ['./test.py'] [root@zhy ~]# ./test.py a b ['./test.py', 'a', 'b'] [root@zhy ~]#
2、os模块
os.system("cmd"):该方法用于执行系统命令,其中"cmd"则为执行的命令,其返回命令执行成功与否的结果,并不会将命令的输出保存下来。
[root@zhy python_learn]# cat test.py #!/usr/bin/env python3 # -*- coding: UTF-8 -*- import os result = os.system("ls") print("打印变量result:",result) [root@zhy python_learn]# ./test.py test.py 打印变量result: 0 [root@zhy python_learn]#
os.popen("cmd"):该方法同样用于执行系统命令,其中"cmd"为命令,其返回结果为一个对象,其调用read()方法会显示系统命令执行结果。
[root@zhy python_learn]# cat test.py #!/usr/bin/env python3 # -*- coding: UTF-8 -*- import os result = os.popen("ls") print("打印变量result:",result) print("打印变量result.read():",result.read()) [root@zhy python_learn]# ./test.py 打印变量result: <os._wrap_close object at 0x7fbe58392898> 打印变量result.read(): test.py [root@zhy python_learn]#
os.mkdir("dir name"):该方法用于创建目录,该方法只能用于创建一级目录,创建多级目录会报错。
[root@zhy python_learn]# cat test.py #!/usr/bin/env python3 # -*- coding: UTF-8 -*- import os os.mkdir("./dir1/") [root@zhy python_learn]# ./test.py [root@zhy python_learn]# ls dir1 test.py [root@zhy python_learn]#
二、.pyc是个什么鬼?
1. Python是一门解释型语言?
我初学Python时,听到的关于Python的第一句话就是,Python是一门解释性语言,我就这样一直相信下去,直到发现了*.pyc文件的存在。如果是解释型语言,那么生成的*.pyc文件是什么呢?c应该是compiled的缩写才对啊!为了防止其他学习Python的人也被这句话误解,那么我们就在文中来澄清下这个问题,并且把一些基础概念给理清。
2. 解释型语言和编译型语言
计算机是不能够识别高级语言的,所以当我们运行一个高级语言程序的时候,就需要一个“翻译机”来从事把高级语言转变成计算机能读懂的机器语言的过程。这个过程分成两类,第一种是编译,第二种是解释。
编译型语言在程序执行之前,先会通过编译器对程序执行一个编译的过程,把程序转变成机器语言。运行时就不需要翻译,而直接执行就可以了。最典型的例子就是C语言。
解释型语言就没有这个编译的过程,而是在程序运行的时候,通过解释器对程序逐行作出解释,然后直接运行,最典型的例子是Ruby。
通过以上的例子,我们可以来总结一下解释型语言和编译型语言的优缺点,因为编译型语言在程序运行之前就已经对程序做出了“翻译”,所以在运行时就少掉了“翻译”的过程,所以效率比较高。但是我们也不能一概而论,一些解释型语言也可以通过解释器的优化来在对程序做出翻译时对整个程序做出优化,从而在效率上超过编译型语言。
此外,随着Java等基于虚拟机的语言的兴起,我们又不能把语言纯粹地分成解释型和编译型这两种。用Java来举例,Java首先是通过编译器编译成字节码文件,然后在运行时通过解释器给解释成机器文件。所以我们说Java是一种先编译后解释的语言。
3. Python到底是什么
其实Python和Java/C#一样,也是一门基于虚拟机的语言,我们先来从表面上简单地了解一下Python程序的运行过程吧。当我们在命令行中输入python hello.py时,其实是激活了Python的“解释器”,告诉“解释器”:你要开始工作了。可是在“解释”之前,其实执行的第一项工作和Java一样,是编译。
熟悉Java的同学可以想一下我们在命令行中如何执行一个Java的程序:
javac hello.java
java hello
只是我们在用Eclipse之类的IDE时,将这两部给融合成了一部而已。其实Python也一样,当我们执行python hello.py时,他也一样执行了这么一个过程,所以我们应该这样来描述Python,Python是一门先编译后解释的语言。
4. 简述Python的运行过程
在说这个问题之前,我们先来说两个概念,PyCodeObject和pyc文件。
我们在硬盘上看到的pyc自然不必多说,而其实PyCodeObject则是Python编译器真正编译成的结果。我们先简单知道就可以了,继续向下看。
当python程序运行时,编译的结果则是保存在位于内存中的PyCodeObject中,当Python程序运行结束时,Python解释器则将PyCodeObject写回到pyc文件中。
当python程序第二次运行时,首先程序会在硬盘中寻找pyc文件,如果找到,则直接载入,否则就重复上面的过程。
所以我们应该这样来定位PyCodeObject和pyc文件,我们说pyc文件其实是PyCodeObject的一种持久化保存方式。
三、数据类型
1、数字:包括整型,浮点型,复数类型三种
int:整型
float:浮点型
complex:复数
2、布尔值:只有两个值,一个表示真,一个表示假
3、字符串
4、列表
5、元组
6、字典
四、数据运算
1、数学运算
2、比较运算符
3、逻辑运算
4、赋值运算
5、成员运算
6、身份运算
7、位运算符
8、三元运算
result = 值1 if 条件 else 值2
result的值根据条件是否成立来判断,如果条件成立则为"值1",如果条件不成立则为"值2"。
9、bytes类型
该类型表示二进制类型。
string.encode('字符编码') >> bytes 指定字符串由某种字符编码转为二进制。
bytes.decode('字符编码') >> string 指定由二进制转为某种字符编码字符串。
python3中通过网络传输数据的情况下必须使用二进制形式传输。
10、运算符优先级
五、列表
1、定义:[]
2、切片:
name = [1,2,3,4,5]
name[1:3] 顾头不顾尾,切片时从起始位置开始,到结束位置前一个为止。
name[-1] 取列表的倒数第一个值。
name[-1:-3] 这种写法错误,取值的时候是从左往右取值。
name[-2:] 从倒数第二个开始取到最后一个。
name[:3] 从开头取到第三个位置。
name[::2] 第三位为步长。
3、增:
name.append('value') 追加到列表最后。
name.insert(index,'value') 插入到某个位置,想插入到第几个位置就写对应的索引值。
4、删:
name.remove['value'] 删除时直接写要删除的值。
del name[index] 删除对应索引值的元素。
name.pop() 默认删除最后一个元素,pop(index)输入索引值后会删掉对应的索引位置的值。
name.clear() 清空列表。
5、改:
name[index] = 'value' 使用索引直接改值。
6、查:
name.index('value') 返回value值对应的索引值。
name.count('value') 返回列表中value的个数。
name.reverse() 反转列表顺序。
name.sort() 按照ASIIC顺序排序。
a = ["zhangsan","lisi"]
name.extend(a) 使用列表a扩展name列表。
浅copy:
name1 = name.copy()
浅copy时,新的列表会复制旧列表的第一层内容,旧列表中嵌套的内容不会完全被复制,当第二层以内的数据发生修改时,新旧列表都会被修改。
深copy:
深copy时会将旧列表完全复制。
import copy
name2 = name.deepcopy()
六、元组:
元组就是只读列表,不能更改,只有count和index两个方法。
七、字符串操作
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
name = "zhanghao\tyan" print("name.capitalize():首字母大写",name.capitalize()) print("name.count('a'):统计字符串中子串a出现的次数",name.count("a")) print("name.center(50,'-'):输出50个字符,把name放在这50个字符中间,其余字符由-补齐\n",name.center(50,'-')) print("name.encode('utf-8'):把字符串转化成二进制") print("name.endswith('an'):判断字符串是不是以字符串an结尾",name.endswith('an')) print("name.expandtabs(tabsize=30):扩展字符串中包含的tab键为30个空格",name.expandtabs(tabsize=30)) print("name.find('ao'):查找子串ao在字符串中开始的位置的索引值",name.find('ao')) print("字符串也可以切片,用法同列表") print("name.isalnum():判断字符串是不是英文字母、阿拉伯数字",name.isalnum()) print("name.isalpha():判断字符串是否全是英文字母",name.isalpha()) print("name.isdecimal():判断字符串是不是十进制",name.isdecimal()) print("name.isdigit():判断字符串是不是一个整数",name.isdigit()) print("name.isidentifier():判断字符串是不是一个合法的变量名",name.isidentifier()) print("name.islower():判断字符串是不是小写",name.islower()) print("name.isnumeric():判断字符串是不是只由数字组成",name.isnumeric()) print("name.isspace():判断字符串是不是空格",name.isspace()) print("name.istitle():判断字符串是不是每个单词首字母大写",name.istitle()) print("name.isprintable():判断字符串是不是可以打印的",name.isprintable()) print("name.isupper():判断字符串是不是全是大写",name.isupper()) print("','.join(['a','b','c']):用于将列表转化为字符串",','.join(['a','b','c'])) print("name.ljust(50,'*'):输出50个字符,不够的部分在右边使用*补齐",name.ljust(50,'*')) print("name.rjust(50,'-'):输出50个字符,不够的部分在左边使用-补齐",name.rjust(50,'-')) print("name.lower():把字符串中的大写字母转化为小写字母",name.lower()) print("name.upper():把字符串中的小写字母转化为大写字母",name.upper()) print("name.lstrip():去除字符串左边的回车或换行",name.lstrip()) print("name.rstrip():去除字符串右边的回车或换行",name.rstrip()) print("name.strip():去除字符串两边的回车或换行",name.strip()) print("name.replace('a','A',2):把字符串中的a替换成A,替换两次,替换次数不写表示全部替换",name.replace('a','A',2)) print("name.rfind('a'):从左往右查找最右边的a,返回其索引值",name.rfind('a')) print("name.split('a'):将字符串按照a为分隔符分割为列表,分隔符默认是空格或tab",name.split('a')) print("name.splitlines():按照换行分割为列表",name.splitlines()) print("name.startwith('zh'):判断字符串是不是以zh为开头",name.startswith('zh')) print("name.swapcase():将字符串大小写呼唤",name.swapcase()) print("name.title():将每个单词首字母大写,变成一个title",name.title()) name.capitalize():首字母大写 Zhanghao yan name.count('a'):统计字符串中子串a出现的次数 3 name.center(50,'-'):输出50个字符,把name放在这50个字符中间,其余字符由-补齐 -------------------zhanghao yan------------------- name.encode('utf-8'):把字符串转化成二进制 name.endswith('an'):判断字符串是不是以字符串an结尾 True name.expandtabs(tabsize=30):扩展字符串中包含的tab键为30个空格 zhanghao yan name.find('ao'):查找子串ao在字符串中开始的位置的索引值 6 字符串也可以切片,用法同列表 name.isalnum():判断字符串是不是英文字母、阿拉伯数字 False name.isalpha():判断字符串是否全是英文字母 False name.isdecimal():判断字符串是不是十进制 False name.isdigit():判断字符串是不是一个整数 False name.isidentifier():判断字符串是不是一个合法的变量名 False name.islower():判断字符串是不是小写 True name.isnumeric():判断字符串是不是只由数字组成 False name.isspace():判断字符串是不是空格 False name.istitle():判断字符串是不是每个单词首字母大写 False name.isprintable():判断字符串是不是可以打印的 False name.isupper():判断字符串是不是全是大写 False ','.join(['a','b','c']):用于将列表转化为字符串 a,b,c name.ljust(50,'*'):输出50个字符,不够的部分在右边使用*补齐 zhanghao yan************************************** name.rjust(50,'-'):输出50个字符,不够的部分在左边使用-补齐 --------------------------------------zhanghao yan name.lower():把字符串中的大写字母转化为小写字母 zhanghao yan name.upper():把字符串中的小写字母转化为大写字母 ZHANGHAO YAN name.lstrip():去除字符串左边的回车或换行 zhanghao yan name.rstrip():去除字符串右边的回车或换行 zhanghao yan name.strip():去除字符串两边的回车或换行 zhanghao yan name.replace('a','A',2):把字符串中的a替换成A,替换两次,替换次数不写表示全部替换 zhAnghAo yan name.rfind('a'):从左往右查找最右边的a,返回其索引值 10 name.split('a'):将字符串按照a为分隔符分割为列表,分隔符默认是空格或tab ['zh', 'ngh', 'o\ty', 'n'] name.splitlines():按照换行分割为列表 ['zhanghao\tyan'] name.startwith('zh'):判断字符串是不是以zh为开头 True name.swapcase():将字符串大小写呼唤 ZHANGHAO YAN name.title():将每个单词首字母大写,变成一个title Zhanghao Yan
八、字典操作
1、定义:dic = {key:value,...}
info = {"stu1":"zhangsan","stu2":"lisi"}
字典是无序且key不能重复的。
2、增:
info["new key"] = "new value" 使用新key对应新value来增加。
3、删:
del info 删除整个字典。
del info["key"] 删除某个key对应的键值对。
info.pop("key") 根据key删除对应的键值对。
info.popitem() 随机删除一条记录。
4、改:
info["key"] = newvalue 修改该key对应的value。
5、查:
info["key"] 返回该key对应的value,如果key不存在则会报错。
info.get(key) 如果key不存在不会报错,会返回none。
"key" in info 查找key是否在字典中。
6、字典方法:
info.keys() 返回字典中所有的key,使用list(info.keys())转化成列表。
info.values() 返回字典中所有的value,使用list()函数转化成列表。
info.items() 将字典中的键值对组成元组,元组组成列表,使用list()函数转化成列表。
info.setdefault("key","value") 设置字典默认值,如果字典中key存在则保留原值,如果不存在,则增加新值。
a = {"stu1":"lisi",1:2,3:4}
info.update(a) 升级字典,使用新字典中的键值对替换原有键值对,原字典中没有的键值对则新增到原字典中。
7、遍历字典:
#方法1
for key in info:
print(key,info[key])
#方法2
for k,v in info.items(): #会先把dict转成list,当数据特别多时效率十分低下
print(k,v)