python基础2
一、.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、数字
2 是一个整数的例子。
长整数 不过是大一些的整数。
3.23和52.3E-4是浮点数的例子。E标记表示10的幂。在这里,52.3E-4表示52.3 * 10-4。
(-5+4j)和(2.3-4.6j)是复数的例子,其中-5,4为实数,j为虚数,数学中表示复数是什么?。
int(整型)
在32位机器上,整数的位数为32位,取值范围为-2**31~2**31-1,即-2147483648~2147483647
在64位系统上,整数的位数为64位,取值范围为-2**63~2**63-1,即-9223372036854775808~9223372036854775807
long(长整型)
跟C语言不同,Python的长整数没有指定位宽,即:Python没有限制长整数数值的大小,但实际上由于机器内存有限,我们使用的长整数数值不可能无限大。
注意,自从Python2.2起,如果整数发生溢出,Python会自动将整数数据转换为长整数,所以如今在长整数数据后面不加字母L也不会导致严重后果了。
float(浮点型)
先扫盲 http://www.cnblogs.com/alex3714/articles/5895848.html
浮点数用来处理实数,即带有小数的数字。类似于C语言中的double类型,占8个字节(64位),其中52位表示底,11位表示指数,剩下的一位表示符号。
complex(复数)
复数由实数部分和虚数部分组成,一般形式为x+yj,其中的x是复数的实数部分,y是复数的虚数部分,这里的x和y都是实数。
注:Python中存在小数字池:-5 ~ 257
2、布尔值
真或假
1 或 0
3、字符串
"hello world"
万恶的字符串拼接:
python中的字符串在C语言中体现为是一个字符数组,每次创建字符串时候需要在内存中开辟一块连续的空,并且一旦需要修改字符串的话,就需要再次开辟空间,万恶的+号每出现一次就会在内从中重新开辟一块空间。
字符串格式化输出
name = "alex"
print "i am %s " % name
#输出: i am alex
PS: 字符串是 %s;整数 %d;浮点数%f
三、列表
1、创建列表:
name_list = ['alex', 'seven', 'eric']
或
name_list = list(['alex', 'seven', 'eric'])
2、基本操作:
索引 下标,从0开始 name.index("vn")
插入 name.insert(5,"eve")
切片 name[2:8] name[:] name[-1:]
追加 name.append("vn")
删除 name.remove("ez") name.pop() 删除最后一个元素 name.pop(2) 删除索引2的元素 del name[3:6]
修改 name[3] = "id:vn"
步长 name[0:-1:2] name[::3] 不写下标表示列表从头到尾
长度 len (name)
循环 for i in range(name.count(9)):
包含 "vn" in name
计数 name.count("ez")
合并 name.extend(name2)
反转 name.reverse()
排序 name.sort() 按照ascii表排序(python2支持)
复制 name2 = name.copy() 复制的列表不修改列表第一层内容,如果列表内的列表修改,复制的列表会随着修改
克隆 name2 = copy.deepcopy(name) 需import copy 模块,完全复制,整个内存数据完全复制,列表内的列表修改不随着变。切片
找到列表中所有9改为999代码:
for i in range(name.count(9)):
name[name.index(9)] = 999
print(name)
找到列表中所有33删掉:
for i in range(name.count(33)):
name.pop(name.index(33))
print(name)
四、元组(不可变列表)
1、创建元组:
ages = (11, 22, 33, 44, 55)
或
ages = tuple((11, 22, 33, 44, 55))
2、基本操作:
ages.count(11)
ages.index(11)
五、字符串常用功能
移除空白
nameuser = input("user:")
if nameuser.strip() == "Guo": #nameuser.strip()默认是脱去空格回车
print("welcom")
分割
names = "vn,ez,mm"
name2 = names.split(",") #以,逗号为分割符,分割为列表
print(name2)
print("|".join(name2)) #把上面name2列表以|符号合并为字符串
长度
索引
切片
name = "Guotg"
print(name[2:6])
print(name.center(30,"-")) #以-填充居中
msg = "Hello:{0},Age:{1}"
print(msg.format("Guo",27)) #format格式化字符串
name = "Guo Tg"
print("" in name) #判断有没有空格
name = "Guo Tg"
print(name.find("o")) #查找字符,知道到返回下标,未找到返回-1
name.isalnum() #判断是否有特殊字符
name.endswith('tg') #判断以什么结尾
name.startswith('Guo') #判断以什么开头
name.lower() #使小写
name.upper() #使大写
判断是否是数字代码:
age = input("your age:")
if age.isdigit(): #isdigit判断是不是数字
age = int(age)
else:
print("error")
六、数据运算
算数预算:(假设变量a为10,变量b为20)
+ 加: 两个对象相加 a + b 输出结果 30
- 减: 得到负数或是一个数减去另一个数 a - b 输出结果 -10
* 乘: 两个数相乘或是返回一个被重复若干次的字符串 a * b 输出结果 200
/ 除: x除以y b / a 输出结果 2
% 取模: 返回除法的余数 b % a 输出结果 0
** 幂: 返回x的y次幂 a**b 为10的20次方, 输出结果 100000000000000000000
// 取整除: 返回商的整数部分 9//2 输出结果 4 , 9.0//2.0 输出结果 4.0
比较运算:(以下假设变量a为10,变量b为20)
== 等于: 比较对象是否相等 (a == b) 返回 False。
!= 不等于: 比较两个对象是否不相等 (a != b) 返回 true.
<> 不等于: 比较两个对象是否不相等 (a <> b) 返回 true。这个运算符类似 != 。
> 大于: 返回x是否大于y (a > b) 返回 False。
< 小于: 返回x是否小于y。所有比较运算符返回1表示真,返回0表示假。这分别与特殊的变量True和False等价。注意,这些变量名的大写。 (a < b) 返回 true。
>= 大于等于: 返回x是否大于等于y。 (a >= b) 返回 False。
<= 小于等于: 返回x是否小于等于y。 (a <= b) 返回 true。
赋值运算:(以下假设变量a为10,变量b为20)
= 简单的赋值运算符 c = a + b 将 a + b 的运算结果赋值为 c
+= 加法赋值运算符 c += a 等效于 c = c + a
-= 减法赋值运算符 c -= a 等效于 c = c - a
*= 乘法赋值运算符 c *= a 等效于 c = c * a
/= 除法赋值运算符 c /= a 等效于 c = c / a
%= 取模赋值运算符 c %= a 等效于 c = c % a
**= 幂赋值运算符 c **= a 等效于 c = c ** a
//= 取整除赋值运算符 c //= a 等效于 c = c // a
逻辑运算:(假设变量 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
成员运算:
in 如果在指定的序列中找到值返回 True,否则返回 False。 x 在 y 序列中 , 如果 x 在 y 序列中返回 True。
not in 如果在指定的序列中没有找到值返回 True,否则返回 False。 x 不在 y 序列中 , 如果 x 不在 y 序列中返回 True。
身份运算:
is is是判断两个标识符是不是引用自一个对象 x is y, 如果 id(x) 等于 id(y) , is 返回结果 1
is not is not是判断两个标识符是不是引用自不同对象 x is not y, 如果 id(x) 不等于 id(y). is not 返回结果 1
位运算:(下面变量 a 为 60,b 为 13)
& 按位与运算符:参与运算的两个值,如果两个相应位都为1,则该位的结果为1,否则为0 (a & b) 输出结果 12 ,二进制解释: 0000 1100
| 按位或运算符:只要对应的二个二进位有一个为1时,结果位就为1。 (a | b) 输出结果 61 ,二进制解释: 0011 1101
^ 按位异或运算符:当两对应的二进位相异时,结果为1 (a ^ b) 输出结果 49 ,二进制解释: 0011 0001
~ 按位取反运算符:对数据的每个二进制位取反,即把1变为0,把0变为1 (~a ) 输出结果 -61 ,二进制解释: 1100 0011, 在一个有符号二进制数的补码形式。
<< 左移动运算符:运算数的各二进位全部左移若干位,由"<<"右边的数指定移动的位数,高位丢弃,低位补0。 a << 2 输出结果 240 ,二进制解释: 1111 0000
>> 右移动运算符:把">>"左边的运算数的各二进位全部右移若干位,">>"右边的数指定移动的位数 a >> 2 输出结果 15 ,二进制解释: 0000 1111
运算符优先级:
** 指数 (最高优先级)
~ + - 按位翻转, 一元加号和减号 (最后两个的方法名为 +@ 和 -@)
* / % // 乘,除,取模和取整除
+ - 加法减法
>> << 右移,左移运算符
& 位 'AND'
^ | 位运算符
<= < > >= 比较运算符
<> == != 等于运算符
= %= /= //= -= += *= **= 赋值运算符
is is not 身份运算符
in not in 成员运算符
not or and 逻辑运算符
七、while loop 死循环
count = 0 while True: print("你是风儿我是沙,缠缠绵绵到天涯...",count) count +=1 上面循环100次就退出的代码: count = 0 while True: print("你是风儿我是沙,缠缠绵绵到天涯...",count) count +=1 if count == 100: print("去你妈的风和沙,你们这些脱了裤子是人,穿上裤子是鬼的臭男人..") break break退出整个循环,continue退出单次循环
八、字典
创建字典:
person = {"name": "mr.wu", 'age': 18}
或
person = dict({"name": "mr.wu", 'age': 18})
常用操作:
索引
新增
删除
键、值、键值对
循环
长度
代码:
id_db = {
130921196209246656:{
"name":"GuoZx",
"age":55,
"addr":"CZ"
},
13092119908066656:{
"name":"GuoTg",
"age":27,
"addr":"CZ"
},
130921198610246656:{
"name":"Guojj",
"age":30,
"addr":"CZ"
}
}
for k,v in id_db.items(): #循环,效率低,因为有一个字典转换为元组的过程
print(k,v)
for key in id_db: #循环,建议用此种方法
print(key,id_db[key])
print(id_db[13092119908066656])
id_db[13092119908066656]["name"]="GTG" #修改name
id_db[13092119908066656]["qq"]=553136861 #增加qq值
print(id_db.get(13092119908066656)) #获取key的所有值,如果是不存在的key,返回None
del id_db[13092119908066656]["addr"] #删除addr值
id_db[13092119908066656].pop("age") #删除age值
print(id_db[13092119908066656])
print(id_db.items()) #items,字典变成元组(当字典较大的时候建议不要做此操作)
print(id_db.values()) #打印字典的所有value,不打印key
print(id_db.keys()) #打印字典的所有key
13092119908066656 in id_db #判断key是否在字典中
print(id_db.setdefault(1309211990806665666666,"guoguogou")) #取一个key,如果存在打印出来,如果不存在就添加一个k,v值
print(id_db.fromkeys([5,8,9,3,6,33],"guoguoguo")) #把列表中的值当作字典的key打印出来value就是guoguoguo。(跟id_db没有任何关系)
print(id_db.popitem()) #随机删除字典中一条(一般情况不用)
dict2 = {
"namename":"guoguoguo",
13092119908066656:{
"name":"guotiegang",
"age":27,
"addr":"CangZhou"
}
}
id_db.update(dict2) #dict2更新到id_db字典,id_db字典没有的内容直接添加,有变动的内容覆盖
print(id_db)
购物车代码: salary = input("input your salary:") if salary.isdigit(): salary = int(salary) else: exit("invalid data type") welcome_msg = "Welcome shopping mall".center(60, "=") print(welcome_msg) product_list = [ ("iphone", 6000), ("note7", 5688), ("TCL", 3999), ("LG", 2999), ("Shirt", 99), ("trousers", 199) ] shopping_cart = [] exit_flag = False while exit_flag is not True: print("product_list".center(60, "-")) for item in enumerate(product_list): index = item[0] p_name = item[1][0] p_price = item[1][1] print(index, "、", p_name, p_price) user_choice = input("(q--quit,c--check)what do you want to buy:") if user_choice.isdigit(): user_choice = int(user_choice) if user_choice < len(product_list): p_item = product_list[user_choice] if p_item[1] <= salary: shopping_cart.append(p_item) salary -= p_item[1] print("Added [%s] into shopping_cart,you current balance is \033[31;1m[%s]\033[0m" % (p_item, salary)) else: print("Your balance is [%s],cannot afford this ....." % salary) else: if user_choice == "q" or user_choice == "quit": print("purchased products as below".center(60,"*")) for item in shopping_cart: print(item) print("END".center(60,"*")) print("your salary is \033[41;1m[%s]\033[0m" % salary) exit_flag = True elif user_choice == "c" or user_choice == "check": print("purchased products as below".center(60, "*")) for item in shopping_cart: print(item) print("END".center(60, "*"))
九、集合
set,无序、不重复序列
创建:
s1 = {"123","234"}
s2 = set()
s3 = set([11,22,33])
添加(add):
se = set()
se.add(123)
差别(difference):
s1 = {11,22,33}
s2 = {22,33,44}
s3 = s1.difference(s2) s1中存在,s2中不存在
s4 = s1.symmetric_difference(s2) 对称差别,显示AB中不相同的
s1.difference_update(s2) 直接更新集合为difference得到的值
s1.symmetric_difference_update(s2) 直接更新集合为symmetric_difference得到的值
移除(discard,remove,pop):
s1 = {11,22,33}
s1.discard(11) discard移除指定元素,不存在不报错
s1.remove(22) remove移除指定元素,不存在报错
ret = s1.pop() pop随机移除元素,可赋值
交集(intersection):取交集
s1 = {11,22,33}
s2 = {22,33,44}
s3 = s1.intersection(s2)
s1.intersection_update(s2) 取交集并更新到s1中
print(s1.isdisjoint(s2)) 判断两个集合有没有交集,如果没有交集返回True,否则返回False
并集(union):
s1 = {11,22,33}
s2 = {22,33,44}
s4 = s1.union(s2)
更新(updae):
s1 = {11,22,33}
s2 = [33,55,66]
s1.update(s2) update后面加的参数,是个可迭代的对象,如列表、字符串、元组
print(s1)
cmdb用到代码: old_dict = { "#1":8, "#2":4, "#4":2, } new_dict = { "#1":4, "#2":4, "#3":2, } old_set = set(old_dict.keys()) new_set = set(new_dict.keys()) remove_set = old_set.difference(new_set) add_set = new_set.difference(old_set) update_set = old_set.intersection(new_set)
浙公网安备 33010602011771号