Long Way To Go 之 Python 2
模块
别人写好了的程序,可下载或直接调用,分为:
标准库(不用安装,直接可以用的 像getpass,sys,os)
第三方库(必须安装才可以用)
PS: python的标准库一般存在 lib (site-packages的上一层);的第三方库一般存在 site-packages
sys:
import sys print(sys.path) # " . " : expand methods of XXXXXXX print(sys.argv) # pycharm里是绝对路径,cmd里相对路径 (其实就是打印的相对路径,不会打印绝对路径) # 为什么pychram是绝对路径? 因为调用的时候写的这个脚本名字的路径就是绝对路径,pycharm在自己调用的时候写的就是绝对路径 print(sys.argv[2]) # 取第二个参数
os:
import os # 可以从python中调用shell的命令 # 或者在系统中创建一个文件,目录 # 查看当前目录下有多少文件,查看文件的大小 cmd_res = os.system("dir") # 只执行命令,只输出在屏幕上,不保存结果 cmd_res1 = os.popen("dir") # 打印的是一个内存的对象地址 cmd_res1 = os.popen("dir").read() # 执行命令,然后结果存到了一个内存里临时的地方,必须用read方法去取 print("-->",cmd_res1) # 0 means success # 在当前目录下,创建一个目录 os.mkdir("new_dir") # shows on the left
第三方库(login.py):
# 文件和login在同一个目录下的时候 import login # 文件和login不在同一个目录下,copy login.py到site-package下去
什么是PYC?
python程序运行时,编译的结果是保存在位于内存中的PyCodeObject中;
python程序运行结束时,python解释器将PyCodeObject写回到pyc文件中
python程序第二次运行的时候,首先程序会在硬盘中寻找pyc文件,如果找到,则直接载入,否则就重复上面的过程
所以,pyc文件其实是PyCodeObject的一种持久化保存方法
Q:pyc保存了,但是源代码重新被改了怎么办?
A: python检测文件,再检测时间,然后看pyc的更新时间和源代码的更新时间哪个最新.
数据类型:
1.数字
int 整型(数)
long 长整型 python3没有这个
float 浮点数
浮点不是小数
浮点的表示形式是小数
小数不只包括浮点 forget it anyway
complex 复数
2.布尔值
真 or 假
1 or 0
3.字符串
"hello world”
4.列表
name = ['momo','shirley','curry'] # or name = list( ['momo','shirley','curry'])
5.元组
和列表差不多,但是不能修改,只能读
ages = (1,2,3,4) # or ages = tuple((1,2,3,4))
6.字典
字典是无序的
person = {"name":{ "momo"}, "age": {"22"}} # or person = dict({"name":{ "momo"}, "age": {"22"}})
数据运算:
算术运算:
// 取整数
9/2 输出结果4
9.0/2/0 输出结果4.0
% 取模 (返回除法的余数)
10%2 输出结果0 11%2 输出结果1
+
-
*
/
** 幂
比较运算:
== 等于
!= 不等于
<> 不等于
>
<
>=
<=
赋值运算:
= 简单的赋值运算符
+= 加法赋值运算符 c+=a c=c+a
-= 减法赋值运算符 c-=a c=c-a
*= 乘法赋值运算符
/= 除法赋值运算符
%= 取模赋值运算符
**= 幂赋值运算符
//= 取整除赋值运算符
逻辑运算:
and
or
not
成员运算:
in
not in
身份运算:
is
is not
位运算:(practice)
& 按位与运算符 a & b 12 = 0000 1100
| 按位或运算符 a | b 61 = 0011 1101
^ 按位异或运算符 a ^ b 49 = 0011 0001
~ 按取位反运算符 a ~ b - -61 = 1100 0011
<< 左移动运算符 a << 2 240 = 1111 0000
>> 右移动运算符 a >> 2 15 = 0000 1111
eg.
a = 60 # 60 = 0011 1100 b = 13 # 13 = 0000 1101
各种操作!!!怎么操作呢?
1.列表操作:
列表是有序的,可做增删减查,也可以多层嵌插列表、元组、字典任何东西
names = ["ZhangYang", "GuYun","XiangPeng","XuLiangChen"] # define a list # list通过下标找元素 names[0] # 正数第一个元素,下标从零开始往右走 name[-1] # 倒数第一个元素
loop for a list
>>>for i in names: print(i) "ZhangYang" "GuYun" "XiangPeng" "XuLiangChen"
切片
print(names[-1]) # unknown length, 取最后一个元素 print(names[0],names[2]) # 取第一项和第三项 print(names[1:3]) # 顾头不顾尾哈哈哈, 从1-2 print(names[0:3]) # 从0-2 和 print(names[:3]) print(names[-2:]) # unknown length, 取最后两项 print(names[:]) # 从头到尾 print(names[::2]) # 从头到尾,间隔2 print(names[0:-1:2]) # 从0到倒数第二,间隔2
添加
names.append("LeiHaiDong") # adding more names
插入
# 插入准确的位置,但是不能同时插两个 names.insert(1,"ChenRongHua") # 插在原本第一项的前面 names.insert(3,"XinZhiYu") # 插在原本第三项的前面
修改
# 修改替换 names[2] = "XieDi" # 把第三项幻城xiedi
删除
names.remove("ChenRongHua") del names[1] names.pop() # delete the last one if no index input #del names[1] = names.pop(1)
统计
print(names.count("ChenRongHua")) # names counting from the list
排序和翻转
names.reverse() # reverse the list names.sort() # sort in letters & if initials are numbers or notations, then notations-->umbers-->letters
找下标
names = ["ZhangYang", "GuYun","XiangPeng","XuLiangChen"] print(names.index("XieDi")) # 但只能找到第一个xiedi的下标
copy!!!!来了!! IMPORTANT!
light copy:
names = ["4ZhangYang", "#!GuYun","xXiangPeng",["alex","jack"],"ChenRongHua","XuLiangChen"] name2 = names.copy() # 浅copy,只copy第一层,所以name2 之后no change print(names) print(name2) names[2] = "向鹏" # name2 no change names[3][0] = "ALEXANDER" # name2 changed 替换alex print(names) print(name2)
names = ["4ZhangYang", "#!GuYun","xXiangPeng",["alex","jack"],"ChenRongHua","XuLiangChen"] name2 = names print(names) print(name2) names[2] = "向鹏" # name2也变了(如果是简单字符串和数字是不会变的(见notes 1 小知识),但是列表里会跟着变) names[3][0] = "ALEXANDER" # name2 changed print(names) print(name2)
deep copy:
import copy names = ["4ZhangYang", "#!GuYun","xXiangPeng",["alex","jack"],"ChenRongHua","XuLiangChen"] name2 = copy.deepcopy(names) print(names) print(name2) names[2] = "向鹏" # name2 no changes names[3][0] = "ALEXANDER" # name2 no changes print(names) print(name2)
2.元组操作
元组是有序的,但是只可读
统计和找下标
ages = (1,2,3,4) # define a tuple print(ages.count("1")) # 统计 print(ages.index(3)) #找下标 people = ("name","age","salary","occupation") print(people.count("name")) print(people.index("age"))
3.字符串操作
字符串是不可修改的
eg. 如果变大小写,原本的字符串就会被覆盖掉
11111111111111111
name = "my name is alex" name1 = "my \tname is alex" # \t 空一隔 name2 = "my \tname is {name} and i am {year} old" # format print(name.capitalize()) # 首字母大写 print(name.title()) # 每个单词第一个字母大写 print(name.zfill(50)) # 在字符串前加50个0 print(name.count("a")) # 统计a的数量 print(name.center(50,"-")) print(name.ljust(50,'*')) print(name.rjust(50,'-')) print(name.encode) # 字符串转二进制 print(name.endswith("ex")) # 判断"ex"结尾 print(name.find("name")) print(name[name.find("name"):9]) # 字符串贴片 print(name1) print(name1.expandtabs(tabsize=30)) # 30个空格 print(name2.format(name= 'alex',year=23)) print(name2.format_map({'name':'alex','year':12}))
输出:
My name is alex My Name Is Alex 00000000000000000000000000000000000my name is alex 2 -----------------my name is alex------------------ my name is alex*********************************** -----------------------------------my name is alex <built-in method encode of str object at 0x0000000002130FB0> True 3 name i my name is alex my name is alex my name is alex and i am 23 old my name is alex and i am 12 old 1234 1,2,3,4 1+2+3+4 aLex li 7 ['a', ' ex ', 'i', ''] ['1', '2', '3', '4'] ['1+2', '+3+4'] ['1+2+3+4']
22222222222222222
print('ab23!'.isalnum()) # 判断是否是阿拉伯数字 print('Aab'.isalpha()) # 判断是否纯英文字符 print('1A'.isdecimal()) # 判断是否是十进制 print('ab23!'.isdigit()) # 判断是否是整数 print('A1a'.isidentifier()) # 判断是不是一个合法的标识符 print('ab23'.islower()) # 判断是不是小写 print('aG'.isupper()) # 判断是不是大写 print('33.33'.isnumeric()) # 判断是不是只有数字 forget it print('ab23!'.isspace()) # 判断是不是空格 print('My Name Is'.istitle()) # 判断是不是标题大写 print('ab23!'.isprintable()) print('Alex'.lower()) # all lower print('Alex'.upper()) # all upper print('Alex Li'.swapcase()) print('Alex\n'.strip()) # strip 会去掉两头的空格和回车 print('\nAlex'.lstrip()) # \n 换行 print('Alex\n'.rstrip()) print('---')
输出:
False
True
False
False
True
True
False
False
False
True
True
alex
ALEX
aLEX lI
Alex
Alex
Alex
---
33333333333333333
# join print(''.join(['1','2','3','4'])) print(','.join(['1','2','3','4'])) print('+'.join(['1','2','3','4'])) print('alex li'.replace('l','L',1)) print('alex lil'.rfind('l')) # 找到最后值的下标 print('al ex lil'.split('l')) # 字符串 --> 列表 print('1+2+3+4'.split('+')) print('1+2\n+3+4'.splitlines()) print('1+2+3+4'.split('\n'))
输出:
1234 1,2,3,4 1+2+3+4 aLex li 7 ['a', ' ex ', 'i', ''] ['1', '2', '3', '4'] ['1+2', '+3+4'] ['1+2+3+4']
随机密码:
# 随机密码!! p = str.maketrans("abcdef",'123456') print("alex li".translate(p)) # 用上面abcde所赋的值(对应的数),去转化“alex li”
4.字典
字典一种key——value的数据类型
通过笔划,字母来查对
字典是无序的,没有下标 (也不需要下标,通过key去找);但是列表有下标,表示位置信息
字典可以多层嵌插字典、列表、元组任何东西
eg.1 loop
# key-value info = { 'stu1101': "TengLan Wu", # key --> stu1101; value --> name 'stu1102': "LongZe Luola", 'stu1103': "XiaoZe Maliya", } # basic loop for i in info: print(i,info[i]) # print key and value # loop 没有上面高效 不推介 for k,v in info.items(): print(k,v)
eg.2 update and combine two dicts
# another dict b = { 'stu1101':"Alex", 1:3, 2:5 } info.update(b) # combine two dicts, keep different items and replace the same one
eg.3 create new dict
>>>c = info.fromkeys([6,7,8],[1,{"name":"alex"},444]) # create new dict >>>print(c) {6: [1, {'name': 'alex'}, 444], 7: [1, {'name': 'alex'}, 444], 8: [1, {'name': 'alex'}, 444]} >>>c[7][1]['name'] = "Jack Chen" # 全改了,不是单独改了一份数据 >>>print(c) {6: [1, {'name': 'Jack Chen'}, 444], 7: [1, {'name': 'Jack Chen'}, 444], 8: [1, {'name': 'Jack Chen'}, 444]}
eg.4 dict converts to list(item), find, existence, modify, add, delete
# dict converts to list print(info.items()) # find print(info["stu1101"]) # if 100% sure it does exist print(info.get('stu1104')) # if no such item exists, returns none # judge weather XXX in the dict print('stu1103' in info) # returns T or F # modify info["stu1101"] = "武藤兰" info["stu1104"] = "CangJingKong" # if no such item exists, then adding this item automatically #del del info["stu1101"] # or info.pop("stu1101") # del info delete the whole dict # info,popitem() free deleting
污污污污小例子:(多级字典嵌套及操作)
av_catalog = { "欧美":{"www.youporn.com": ["很多免费的,世界最大的","质量一般"], "www.pornhub.com": ["很多免费的,也很大","质量比yourporn高点"], "letmedothistoyou.com": ["多是自拍,高质量图片很多","资源不多,更新慢"], "x-art.com": ["质量很高,真的很高","全部收费,屌比请绕过"] }, "日韩":{"tokyo-hot":["质量怎么样不清楚,个人已经不喜欢日韩范了","听说是收费的"] }, "大陆":{"1024":["全部免费,真好,好人一生平安","服务器在国外,慢"] } } av_catalog["大陆"]["1024"][1] = "可以在国内做镜像" # 改 print(av_catalog.values()) # 打印value print(av_catalog.keys()) # 打印key # setdefault 去字典里面找,如果有,就返回;如果没有,创建一个新的 av_catalog.setdefault("台湾",{"www.baidu.com":[1,2]}) print(av_catalog) av_catalog.setdefault("大陆",{"www.baidu.com":[1,2]}) # 大陆不会有变化 BUT 也没有新创建一个值 print(av_catalog)
小程序之 购物车
product_list = [ ('Iphone',5800), ('Mac Pro',9800), ('Bike',800), ('Watch',10600), ('Coffee',31), ('Alex Python',120), ] shopping_list = [] salary = input("Input your salary:") # 工资只要输入一次,所以写在循环外面 if salary.isdigit(): # 判断整数 salary = int(salary) while True: for index,item in enumerate(product_list): # enumerate: 把列表下标直接取出来 print(index,item) 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)) # red31,green32 else: print("\033[41;1m你的余额只剩[%s]拉,还买个毛线\033[0m"% salary) # red_background41 green_background42 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:",salary) exit() else: print('invalid option')
小程序之 三级菜单
data = { '北京':{ "昌平":{ "沙河":["oldboy","test"], "天通苑":["链家地产","我爱我家"] }, "朝阳":{ "望京":["奔驰","陌陌"], "国贸":["CICC","HP"], "东直门":["Advent","飞信"] }, "海淀":{}, }, '山东':{ "德州":{}, "青岛":{}, "济南":{}, }, '广东':{ "东莞":{}, "常熟":{}, "佛山":{}, }, } exit_flag = False # 为了在任意一层可以退出 while not exit_flag: for i in data: print(i) choice = input("选择进入1>>:") if choice in data: # 在不在字典里 while not exit_flag: # 死循环 for i2 in data[choice]: print("\t",i2) choice2 = input("选择进入2>>:") if choice2 in data[choice]: while not exit_flag: # 死循环 for i3 in data[choice][choice2]: print("\t\t",i3) choice3 = input("选择进入3>>:") if choice3 in data[choice][choice2]: for i4 in data[choice][choice2][choice3]: print("\t\t",i4) choice4 = input("最后一层,按b返回>>:") if choice4 == "b": pass # 什么也不做,不写就报错了,其实就是个占位符 elif choice4 == "q": exit_flag = True if choice3 == "b": break elif choice3 == "q": exit_flag = True if choice2 =="b": break elif choice2 == "q": exit_flag = True