模块
又可称为库。python强大的地方在于他有非常丰富和强大的标准库和第三方库。
以两个sys模块和os模块为例,先看sys:
import sys
print(sys.path)
print(sys.argv)
print(sys.argv[2])
其中“sys.path”这种格式就是指“模块.方法”,文件起名字一定不能导入模块的名字相同。
sys.path是python内部环境变量,使用的模块会在打印结果中寻找,第三方库一般存在lib\site-package里面。
argv显示当前相对路径,
argv[2]表示输出刚刚输入的第二个值(使用python命令行界面,输入python sys1.py a b c,结果会单独显示一个b,输入的第二个值就是列表中第3个值)
os模块:
import os
os.system("dir")
dir在windows上的输出结果会打在屏幕上,执行结果成功实则为0,不能保存结果到变量。
import os
cmd_res = os.popen("dir").read()
print("---->",cmd_res)
os.mkdir("new_dir")
使用popen能将结果存在内存中,如果不加read(),赋给变量的只是一个内存地址,加了read才是我们需要的值。
os.mkdir则是在当前目录新建子目录。
也可以调用自建模块,如我在同目录下有一个login.py的文件,可以直接import login来调用。
如果放在不同目录下的话,需要保证放在环境变量目录中,如size-package下,或者修改环境变量增加一个存放目录。
当我们调用的时候会产生一个.pyc文件(3版本会放在__pycache__目录下),当程序运行时,编译的结果保存在内存中国的PyCodeObject中,当程序运行结束时,Python解释器则将PyCodeObject写回到.pyc文件中。当python程序第二次运行时,首先程序会在硬盘中寻找pyc文件,如果找到(且pyc比源代码更新时间晚),则直接载入,否则重复上面的过程。
因此pyc文件其实就是PyCodeObject的一种持久化保存方式。
注意编译的结果不是机器码,还差的很多,只是一个二进制文件。
数据类型
数字
int(整型)
64位系统上,整数位数为64位,取值范围是-263~(263-1),在python中取多少次幂用双*表示,如2**32
long(长整型)
python2的长整数没有指定位宽,最大与内存相关,python3中没有长整型,无论存多大都是int。
float(浮点型)
表示形式是小数,类似于C语言中的double类型。
complex(复数)
基本用不到。
布尔值
只有两个值,真或假,对应1或0。
字符串
bytes类型
字节类型和字符串是两回事,字符串使用encode编码,二进制使用decode解码,python中不指定编码格式的话会使用utf-8:
msg='niubi'
print(msg)
print(msg.encode())
print(msg.encode(encoding="utf-8"))
print(msg.encode(encoding="utf-8").decode(encoding="utf-8"))
列表
列表也是一种类型,单独拿出来说一下。
声明方式就是中括号[]:
names = ["wangwenjie","wangxuanzhen","wangyixiao","xialunhao"]
print(names)
取列表的值:
print(names[0])
print(names[0],names[2])
print(names[1:3]) #取连续值,也叫切片,是左闭右开的
print(names[-1]) #取最后一个值
print(names[-2]) #取倒数第二个值
print(names[-3:-1]) #注意都是从左往右取
print(names[-3:]) #冒号后面不写东西表示取到最后一个值
print(names[:3]) #同print(names[0:3])
使用append或insert方法来追加值:
names = ["wangwenjie","wangxuanzhen","wangyixiao","xialunhao"]
names.append("xiejiacheng") #在最后插入
names.insert(4,"xiayunchao") #在指定位置插入
print(names)
不能批量插入,只能一个一个来。
直接修改值:
names[1] = "zhangfuyong"
删除值的方法:
names.remove("zhangfuyong")
del names[1]
names.pop()
names.pop(1)
pop()方法不加数字的话会删掉最后一个值。
其他:
print(names.index("wangyixiao")) #找位置
print(names[names.index("wangyixiao")]) #找到位置后取出
print(names.count("zhangfuyong")) #计数
names.clear() #清空列表
names.reverse() #反转列表元素的顺序
names.sort() #排序,特殊符号、数字、大写字母、小写字母,就是按ascII码里的顺序来的
names2 = [1,2,3,4]
names.extend(names2) #合并另一个列表的元素,不会破坏该列表
print(names,names2)
del names2 #删除列表变量
name2 = names.copy #复制
print(name2)
names[1] = "zhangfuyong"
print(name2) #发现在copy过后,修改原表不会使copy表发生变化
列表中还可以包含子列表:
names = ["yi","er","san",["si","wu"],"liu"]
name2 = names.copy()
print(names)
print(name2)
name[2] = "SAN"
names[3][0] = "SI"
print(names)
print(name2)
#会发现虽然san没改,但si改成SI了,因为copy仅copy第一层,是由内存中存储方式决定的
names = ["yi","er","san",["si","wu"],"liu"]
name3 = names
name[2] = "SAN"
names[3][0] = "SI"
print(names)
print(name3)
#会发现全都跟着改了
可以看出,将一个列表变量赋给另一个变量,与将字符串或数字赋给一个变量有所不同,列表会跟着变。
如果我们想真正的不受干扰的复制一个列表,我们需要copy模块的深copy,否则copy.copy()仍然是浅copy:
import copy
names = ["yi","er","san",["si","wu"],"liu"]
name2 = copy.deepcopy(names)
浅copy的几种方式:
person=['name',['a',100]]
p1=copy.copy(person)
p2=person[:]
p3=list(person)
列表循环:
names = ["yi","er","san",["si","wu"],"liu"]
for i in names:
print(i)
列表跳跃切片,以从头到尾每隔一个一输出为例:
names = ["yi","er","san",["si","wu"],"liu"]
print(names[0:-1:2])
print(names[::2])
0和-1是可以省略的
元组类型:
元组tuple又称为只读列表,用小括号声明,一旦定义了便不能修改,其只有两个方法,一个是count,一个是index
names = ('a','b')
列表应用示例
product_list = [
('iphone',5800),
('macbook',9900),
('bike',800),
('watch',10600),
('coffee',31)
]
shopping_list = []
salary = input("input your salary:")
if salary.isdigit():
salary = int(salary)
while True:
for item in product_list:
print(product_list.index(item),item)
# break
# for index,item in enumerate(product_list):
# print(index,item)
# break
user_choice = input("选择要购买的商品编号>>>:")
if user_choice.isdigit():
user_choice = int(user_choice)
if user_choice < len(product_list) and user_choice >= 0:
p_item = product_list[user_choice]
if p_item[1] <= salary: #买得起
shopping_list.append(p_item)
salary -= p_item[1]
print("added %s into shopping cart, your current balance is \033[31;1m%s\033[0m" %(p_item,salary))
else:
print("\033[41;1m你的余额只剩[%s]了\033[0m"%salary)
else:
print("product code [%s] is not exist"%user_choice)
elif user_choice == 'q':
print("-----shopping list-----")
for p in shopping_list:
print(p)
print("your current balance is :",salary)
exit()
else:
print("invalid option")
else:
print("invalid salary")
其中salary.isdigit()判断是否为数字形式,字符串中的数字也属于数字形式。
\033[31;1m和\033[0m括起来的部分是给文字加颜色,不同的颜色请参考:
https://blog.csdn.net/qq_37952052/article/details/124110713
字符串
重点说一下字符串
首字母大写:
name = 'messi'
print(name.capitalize())
网友评论