Python—第2周—module,type,list

一.模块知识

模块又可以叫做库,分为两种,标准库和第三方库。

不用安装直接可以使用的叫标准库,比如sys和os。sys属于解释器自带的库,os在python lib目录下。

需要安装才能使用的的叫第三方库。比如django等等。安装完成后,保存在lib/sit_package下

import sys
import os

print(sys.path)     #打印环境变量
print(sys.argv)     #打印相对路径

#os直接调用,不可以保存为变量
os.system("free -m")
os.system("vmstat 2 5")

#如果要保留打印结果
cmd_res = os.popen("free -m")
print(cmd_res)         #打印内存的地址

#读内存地址获得结果
cmd_res = os.popen("free -m").read()
print(cmd_res)  #临时的将结果存入内存,用read读出来

   os.argv[2] 传参数####暂时不明白。暂时理解是通过输入参数来调用文件执行不同的结果。
View Code

 

例子:简历一个py文件,里面要求输入用户名和密码

然后再建立一个pyt文件调用即可。使用import login

找模块的时候。首先在木目录里面寻找。 

 

二.pyc 是什么鬼

python是解释性语言。但是在程序运行的时候,通过解释器对程序逐行作出解释,然后直接运行。会生成pyc文件。c=compiled 编译

python hello.py 启动了python的解释器,但是在运行之前要编译。

pyc是python编译后的结果。

运行时pycodeobject在内存中,结束时将pycodeobject写入pyc文件中。第二次运行时,会找pyc文件。如果找到就直接载入。重复上面过程。pyc就是一种持久化保存的方式。

类似于sql执行?软硬解析?

 

三.python 数据类型

1.int 整型

在不同的位数机器上有不同的存储范围。在python2中如果超过了int的范围,会自动转换为long整型。python3则没有long这样的区别。就是int。

2.float 浮点型

保存的就是带小数的数字。8个字节,52位表示底,11位表示指数。

比如科学计数法。带小数点的数字

3.布尔值

真或假,1或0

a = 2 or 3
b = 3 or 2
c = [] or 3
d = 2 and {}
e = [] and {}
f = 2 < 3
g = 3 > 2

print(a,b,c,d,e,f,g)


结果:
E:\S14\venv\Scripts\python.exe E:/S14/1-hello/hello
2 3 3 {} [] True True
View Code

 

4.三元运算

对值做判断。那个条件成立就存那个。如果符合就存A。不符合就存B

result = 值1 if 条件 else 值2

a = 123456
b = 987654
h = ''

h = a+b if a>b else a-b
print(h)

如果a>b 就存入a+b 否则就a-b
View Code

 

5.二进制bytes

在python2中认为与字符串是一个玩意。python2中使用系统默认字符,python不用写UTF-8

bytes 在python3中是二进制数据,不隐形的混用字符串和二进制类型拼接,不能互相操作,也不能函数传参

但是字符串可以编码为二进制,二进制可以解码为字符串。

msg = '我爱北京呸,虚伪'
print(msg.encode(encoding='utf-8'))
print(msg.encode(encoding='utf-8').decode(encoding='utf-8'))


结果:
E:\S14\venv\Scripts\python.exe E:/S14/1-hello/hello
b'\xe6\x88\x91\xe7\x88\xb1\xe5\x8c\x97\xe4\xba\xac\xe5\x91\xb8\xef\xbc\x8c\xe8\x99\x9a\xe4\xbc\xaa'
我爱北京呸,虚伪


英文结果却不一样。
msg = 'i love my hometown , changchun '
print(msg.encode(encoding='utf-8'))
print(msg.encode(encoding='utf-8').decode(encoding='utf-8'))

结果:
E:\S14\venv\Scripts\python.exe E:/S14/1-hello/hello
b'i love my hometown , changchun '
i love my hometown , changchun 
View Code

 

6.字符串(不可以修改)

格式化输出:字符串%s     整数%d    浮点数%f   

关于字符串的操作如下
name = 'dustin'
name.capitalize()                     #首字母大写
name.count()                          #统计字母的数量。比如统计t有几个
name.center(50,"-")                   #一共打印50个字符,不够的用-补齐
name.endswith("in")                   #判断字符串以什么结尾
name.expandtabs(tabsize=30)           #当字符串里面有\t 时候。这个可以打印30个空格
name.find('name')                    #找到字符串
name.find(name[name.find("name"):])  #切片的操作。不写6就截取到最后
name="my name is {name} and my old is {yesr}"
name.format(name='dustin',yesr=23)   #格式化输出
name.isalnum()                        #包含阿拉伯数字和字母。
name.isalpha()                        #纯英文字符
name.isdecimal()                      #十进制
name.isdigit()                        #判断是否为整数
name.isidentifier()                   #判断是否为合法标识符,是否为合法的变量名
name.islower()                        #是否为小写
name.isnumeric()                      #是否为一个数字,小数不行
name.isspace()                        #是否为一个空格
name.istitle()                        #是否为
name.isupper()                        #是否为大写
name.join()                           #将列表转成字符串
name.ljust(50,'*')                   #保证字符串长度50,不够以*补全
name.rjust(50,'-')                   #保证从右边开始数,不够以-补全
name.lower()                          #将大写变成小写
name.upper()                          # 将小写变大写
name.lstrip()                         #去掉左边的空格和回车
name.strip()                          #去掉两边的空格和回车
name.rstrip()                         #去掉右边的空格和回车
name.maketrans()                      #将前边的转换为后边的
p = str.maketrans()("abcdef","123456")
print("alex li".translate(p))
结果是1l5x li

name.replace('l','L',1)              #把一个字符替换成其他,将小l替换成大L,如果不写1就全部替换。
name.rfind('u')                      #从左边开始寻找,找到最右边的u的下标返回
name.split('u')                      #以u作为分隔符
name.split('+')                      #加入是1+2+3+4 可以把数字提取出来
name.swapcase()                      #大写变小写,小写变大写
name.title()                         #每个字符首字母大写
name.zfill(50)                       #不够以0填充,前边补0
View Code

 

7..列表

类似于c语言中的数组。

names = ["张三","李四","王五","赵六"]
print(names[0])
print(names[1:3])                   #切片操作
print(names[-1])                    #不知道列表大小,但是取最后的数据
print(names[-3:-1])                 #从右往左边数。要先把-3写前边
print(names[-2:])                   #取最后边的值。但是不想-1
print(names[:3])                    #前边是0也是可以忽略掉的

names.append("雷7")                  #追加
names.insert(1,"日八")               #将数据插入到指定的地方。1为要插入位置的下标
names[2]='天九'                      #修改下标2的数据。重新赋值
names.remove("日八")                 #删除
del names[1]                        #删除
names.pop()                         #删除,没有下标,则删除最后一个
print(names)
print(names.index("王五"))           #返回2就是找到了
print(_names[names.index("王五")])

print(names.count("张三"))           #统计有多少个张三
names.clear                         #清空列表
names.reverse()                     #反转列表顺序
names.sort()                        #排序,按照字母顺序排序,升序。
names.extend(names2)                #合并列表,names2还是存在的
View Code

 

深COPY和浅COPY

names = ["张三","李四","王五",["天天","向上"],"赵六"]
names2 = names.copy()   #拷贝一份给names2,内容完全一样,只copy第一层列表。嵌套更改不更改,一个列表是一个内存指针,找的是内存地址
print(names)
print(names2)
names[2] = "zhangwu"
#列表也可以套用列表
names[3][0]="tiantian"
print(names)
print(names2)


#补充
浅copy:拷贝第一个列表,第二个的每一个元素都是引用。
三种浅copy,person=[‘name’,[‘saving’],100]
p1=copy.copy(person)
p2=person[:]
p3=list(person)
可以用浅copy这样的方式做一个人力资源的模板.一对夫妻有一个共同的账号
person=['name',['saving',100]]
p1=person[:]
p2=person[:]
print(p1,p2)

p1[0]='huangxiaoming'
p2[0]='anjiladbaobei'
print(p1,p2)

p1[1][1]=50
print(p1,p2)
View Code

 

全部复制

不能使用 names=names2 
可以调用 import copy 
还有一些copy.deepcopy 深度copy。不要瞎用。一般情况下不需要copy一下。
copy.deepcopy(names)

for i in names   #列表循环
   prints(i);

跳着切片
range(1,10,2)
print(names[0:-1:2])   跳着切片,0和-1都可以省略。效果是一样的

names = ["张三","李四","王五",["天天","向上"],"赵六"]
names2 = names.copy()   #拷贝一份给names2,内容完全一样,只copy第一层列表。嵌套更改不更改,一个列表是一个内存指针,找的是内存地址
print(names)
print(names2)
names[2] = "zhangwu"
#列表也可以套用列表
names[3][0]="tiantian"
print(names)
print(names2)
View Code

 

8.元组(tuple)

也可以叫做列表,但是是只读的列表,不能更改,只能查。有两个方法 count和index。标志不是[ ] 而是() 

 例子:

写一个购物车程序:

1.启动程序后要求用户输入工资,然后打印商品列表

2.允许用户使用商品编号购买商品

3.用户选择商品后,检测余额是否足够,够就直接扣款,不够提醒

4.可以随时退出,推出时打印已经购买商品和余额

5.扣款成功有提醒,输入q打印购物车list

_Good_list=[['Iphone',5999],
            ['Mac pro',9800],
            ['bike',800],
            ['Watch',16000],
            ['coffe',32],
            ]
shopping_list = []
salary = input("please input your salary:")
if salary.isdigit():                     #判断工资是不是数字,然后int转换
    salary = int(salary)
    while True:
        '''for item in _Good_list:
            #print(item)                  #这样打印出来后没有编号
            print(_Good_list.index(item),item) #可以打印出编号'''
        for index,item in enumerate(_Good_list):    #打印出了一组元组,直接取出下标
            print(index,item)
        user_choice = input("please choice good >>>>:")
        if user_choice.isdigit():
            user_choice = int(user_choice)
            if user_choice < len(_Good_list) and user_choice >=0: #len 获取长度,不能写5.会写死
                p_item = _Good_list[user_choice]
                if p_item[1] <= salary:
                    shopping_list.append(p_item)
                    salary -= p_item[1]
                    print("Add %s into your shopping cart,your current balace is0\%s" %(p_item,salary))
                else:
                    print("your slary [%s] is not allows buy it ")
            else:
                print("good list is not exist ")
        elif user_choice == 'q':
            print("--------shoping list ----------")
            for p in shopping_list:
                print(p)
                print("your current balance:",salary)
                exit()
        else:
            print('input wrong')
View Code

 

9.字典

 属于k-values的类型,打印时是无序的,因为字典没有下标,key是唯一的

info = {
    'stu1101': "TengLan Wu",
    'stu1102': "LongZe Luola",
    'stu1103': "XiaoZe Maliya",
}
print(info)


print(info[“stu1101”])            #可以直接取出值
info[“stu1101”] = “武藤兰”         #直接修改,如果不存在直接新增

del info[“stu1101”]                #删除
info.pop(“stu1101”)                #必须指定k值,推荐使用此方式
info.popitem                       #随机删除

info[‘stu1101’]                    #获取,但不推荐使用这个
info.get(‘stu1103’)                #推荐使用这个来获取,不存在返回none
print(‘stud1103 in info)           #在就获取,不在创建
View Code
info = {
    'stu1101': "TengLan Wu",
    'stu1102': "LongZe Luola",
    'stu1103': "XiaoZe Maliya",
}
#print(info)

#新增
info['stu1104']='苍井空'
print(info)

#修改
info['stu1101']='武藤兰'
print(info)

#删除
info.pop("stu1101")
print(info)

del info['stu1104']
print(info)
#随机删除
info.popitem()
print(info)

#查找,pychram没有结果cpyhon有结果
'stu1102' in info
info.get("stu1102")
info['stu1102']
#如果一个key不存在就报程序错误,get不会会返回node
info["stu1105"]
View Code

 

多级字典嵌套,key 尽量不使用中文

av_catalog = {
    "欧美":{
        "www.youporn.com": ["很多免费的,世界最大的","质量一般"],
        "www.pornhub.com": ["很多免费的,也很大","质量比yourporn高点"],
        "letmedothistoyou.com": ["多是自拍,高质量图片很多","资源不多,更新慢"],
        "x-art.com":["质量很高,真的很高","全部收费,屌比请绕过"]
    },
    "日韩":{
        "tokyo-hot":["质量怎样不清楚,个人已经不喜欢日韩范了","听说是收费的"]
    },
    "大陆":{
        "1024":["全部免费,真好,好人一生平安","服务器在国外,慢"]
    }
}
#修改
av_catalog["大陆"]["1024"][1] += ",可以用爬虫爬下来"
#打印,将修改的东西追加到‘慢’后边
print(av_catalog["大陆"]["1024"])


#在cpython里面执行以下命令

#打印所有元素
av.values()

#打印key,欧美,日韩,大陆
av.keys()
结果:
dict_keys(['欧美', '日韩', '大陆'])

#
av.setdefault('stu1106','alex')
结果:alex
info
打印所有文档


#合并
info
{'stu1102': 'LongZe Luola', 'stu1103': 'XiaoZe Maliya', 'stu1106': 'Alex'}
b = {1:2,3:4, "stu1102":"龙泽萝拉"}
info.update(b)
info
{'stu1102': '龙泽萝拉', 1: 2, 3: 4, 'stu1103': 'XiaoZe Maliya', 'stu1106': 'Alex'}


info = {'stu1102': 'LongZe Luola', 'stu1103': 'XiaoZe Maliya', 'stu1106': 'Alex'}
b = {'stu':'longzelll',1:3,2:4}
print(info)
info.update(b)
print(info)

结果:
E:\S14\venv\Scripts\python.exe E:/S14/1-hello/hello
{'stu1102': 'LongZe Luola', 'stu1103': 'XiaoZe Maliya', 'stu1106': 'Alex'}
{'stu1102': 'LongZe Luola', 'stu1103': 'XiaoZe Maliya', 'stu1106': 'Alex', 'stu': 'longzelll', 1: 3, 2: 4}


将字典转换成列表
info = {'stu1102': 'LongZe Luola', 'stu1103': 'XiaoZe Maliya', 'stu1106': 'Alex'}
print(info)
b = info.items()
print(b)


通过列表生成字典
#通过一个列表生成默认的字典,很坑,改一个会改所有,是一个内存指针
c = info.fromkeys([6,7,8],'testd')
print(c)
c = info.fromkeys(c,50)
print(c)

结果:
{6: 'testd', 7: 'testd', 8: 'testd'}
{6: 50, 7: 50, 8: 50}


#循环打印字典方法1(推荐使用)
for key in info:
    print(key,info[key])
#循环打印字典方法2(数据量大时不推荐)
for k,v in info.items():
#   print(k,v)
View Code

 

多级菜单

data = {
    '北京':{
        '朝阳区':{
            '女人街':["Gome","Pengrun"],
            '金融中心':["Alibaba","HujiaLou"]
        },
        '海淀区':{
            '中关村':["Xindongfang","XDF"],
            '西二旗':["Baidu","BaiDubulding"]
        },
        '丰台区':{
            '马家堡':["Shenmezhidemai","SMZDM"]
        }
    },
    '吉林省':{
        '长春市':{
            '汽车区':["Yiqi","YIQIJQ"],
            '绿园区':["JinKeAn","XiAnQiao"]
        },
        '吉林市':{
            '船营区':["JilinAoD","AoDongzhiyao"],
            '丰满区':["JiLinBank",'JilinBankBullding']
        }
    }
}
while True:
    for i in data:
        print(i)
    choice = input("please choice your want")
    if choice in data:
        while True:
            for j in data[choice]:
                print("\t",j)
            choice2 = input("please choice your want")
            if choice2 in data[choice]:
                while True:
                    for k in data[choice][choice2]:
                        print("\t\t",k)
                    choice3 = input("please choice your want")
                    if choice3 in data[choice][choice2]:
                        for l in data[choice][choice2][choice3]:
                            print("\t\t\t",l)
                        choice4 = input("this is last enter b back")
                        if choice4 == 'b':
                            pass             #pass什么都不做,做一个标识,不加会报错
                if choice3 == 'b':
                    break
        if choice2 == 'b':
            break
View Code
包含退出和退到上一层
exit_flag = False
while not exit_flag:
    for i in data:
        print(i)
    choice = input("please choice your want on 1:")
    if choice in data:
        while not exit_flag:
            for j in data[choice]:
                print("\t",j)
            choice2 = input("please choice your want on 2:")
            if choice2 in data[choice]:
                while  not exit_flag:
                    for k in data[choice][choice2]:
                        print("\t\t",k)
                    choice3 = input("please choice your want on 3:")
                    if choice3 in data[choice][choice2]:
                        for l in data[choice][choice2][choice3]:
                            print("\t\t\t", l)
                        choice4 = input("this is last enter b back")
                        if choice4 == 'b':
                           break
                        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
View Code

 

作业

作业:
购物车优化
用户入口:
1.商品信息存在文件里
2.已购商品,余额记录。都已经记录。下一次进入不需要输入工资
3.
商家入口:
2.可以添加,修改商品价格,
View Code

 

posted @ 2018-08-27 18:09  miranblog  阅读(81)  评论(0)    收藏  举报