Python学习day02

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python学习day02相关的知识,希望对你有一定的参考价值。

#常量(也就是定义后不会再改变的变量),在定义时变量名为大写表明这是个常量。

一、pyc文件

pyc 是由py文件经过编译后二进制文件,py文件变成pyc文件后,加载的速度有所提高,而且pyc是一种跨平台的字节码,是由python 的虚 拟机来执行的。pyc的内容,是跟python的版本相关的,不同版本编译后的pyc文件是不同的,2.5编译的pyc文件,2.4版本的 python是无法执行的。pyc文件也是可以反编译的,不同版本编译后的pyc文件是不同。

二、字符串方法

字符串长度获取:len(str)
字母处理:
  全部大写:str.upper()
  全部小写:str.lower()
  大小写互换:str.swapcase()
  首字母大写,其余小写:str.capitalize()
  首字母大写:str.title()
字符串去空格及去指定字符:
  去两边空格:str.strip()
  去左空格:str.lstrip()
  去右空格:str.rstrip()
  去两边指定的字符:str.strip(指定字符),相应的也有lstrip,rstrip
字符串判断相关:
  是否以start开头:str.startswith(start)
  是否以end结尾:str.endswith(end)
  是否全为字母或数字:str.isalnum()
  是否全字母:str.isalpha()
  是否全数字:str.isdigit()
  是否全小写:str.islower()
  是否全大写:str.isupper()
字符串替换相关:
  替换old为new:str.replace(old,new) #默认全替换
  替换指定次数的old为new:str.replace(old,new,替换次数)
字符串搜索相关:
  搜索指定字符串,没有返回-1:str.find(t)
  指定起始位置搜索:str.find(t,start)
  指定起始及结束位置搜索:str.find(t,start,end)
  从右边开始查找:str.rfind(t)
  搜索到多少个指定字符串:str.count(t)
  上面所有方法都可用index代替,不同的是使用index查找不到会抛异常,而find返回-1
str.center(width[, fillchar]):
    width -- 这是字符串的总宽度。
    fillchar -- 这是填充符,不填默认是空格。
str.capitalize():
  capitalize()方法返回字符串的一个副本,只有它的第一个字母大写。
join方法:
  join 方法用于连接字符串数组 
  例:
  s = [a, b, c, d] 
  print ‘‘.join(s) 
  print -.join(s)

三、列表方法

与字符串的索引一样,列表索引从0开始。列表可以进行截取、组合等。
使用下标索引来访问列表中的值,同样也可以使用方括号的形式截取字符,具体如下
    list1 = [aaaaaa, bbbbbb, 1992, 2016];
    list2 = [1, 2, 3, 4, 5,];
    print "list1[0]: ", list1[0]
    print "list2[1:5]: ", list2[1:5]

列表操作包含以下函数:
1、cmp(list1, list2):比较两个列表的元素 
2、len(list):列表元素个数 
3、max(list):返回列表元素最大值 
4、min(list):返回列表元素最小值 
5、list(seq):将元组转换为列表 
列表操作包含以下方法:
1、list.append(obj):在列表末尾添加新的对象
2、list.count(obj):统计某个元素在列表中出现的次数
3、list.extend(seq):在列表末尾一次性追加另一个序列中的多个值(用新列表扩展原来的列表)
4、list.index(obj):从列表中找出某个值第一个匹配项的索引位置
5、list.insert(index, obj):将对象插入列表
6、list.pop(obj=list[-1]):移除列表中的一个元素(默认最后一个元素),并且返回该元素的值
7、list.remove(obj):移除列表中某个值的第一个匹配项
8、list.reverse():反向列表中元素
9、list.sort([func]):对原列表进行排序

四、字典方法

1、如何访问字典中的值?
adict[key] 形式返回键key对应的值value,如果key不在字典中会引发一个KeyError。
2、如何检查key是否在字典中?
a、has_key()方法 形如:adict.haskey(‘name) 有–>True,无–>False
b、innot in   形如:name in adict      有–>True,无–>False
3、如何更新字典?
a、添加一个数据项(新元素)或键值对
adict[new_key] = value 形式添加一个项
b、更新一个数据项(元素)或键值对
adict[old_key] = new_value
c、删除一个数据项(元素)或键值对
del adict[key] 删除键key的项 / del adict 删除整个字典
adict.pop(key) 删除键key的项并返回key对应的 value值

相关函数:
len() 返回字典的长度
hash() 返回对象的哈希值,可以用来判断一个对象能否用来作为字典的键
dict() 函数,用来创建字典

字典的方法
1、adict.keys() 返回一个包含字典所有KEY的列表;
2、adict.values() 返回一个包含字典所有value的列表;
3、adict.items() 返回一个包含所有(键,值)元祖的列表;
4、adict.clear() 删除字典中的所有项或元素;
5、adict.copy() 返回一个字典浅拷贝的副本;
6、adict.fromkeys(seq, val=None) 创建并返回一个新字典,以seq中的元素做该字典的键,val做该字典中所有键对应的初始值(默认为None);
7、adict.get(key, default = None) 返回字典中key对应的值,若key不存在字典中,则返回default的值(default默认为None);
8、adict.has_key(key) 如果key在字典中,返回True,否则返回False。 现在用 innot in9、adict.iteritems()、adict.iterkeys()、adict.itervalues() 与它们对应的非迭代方法一样,不同的是它们返回一个迭代子,而不是一个列表;
10、adict.pop(key[,default]) 和get方法相似。如果字典中存在key,删除并返回key对应的vuale;如果key不存在,且没有给出default的值,则引发keyerror异常;
11、adict.setdefault(key, default=None) 和set()方法相似,但如果字典中不存在Key键,由 adict[key] = default 为它赋值;
12、adict.update(bdict) 将字典bdict的键值对添加到字典adict中。

五、作业

#!/usr/bin/env python
# _*_ conding:utf-8_*_
import os,json,time

# user_info_file文件为用户密码及身份信息文件
if os.path.exists("user_info_file"):   #如果存在不做任何操作
    pass
else:                                         #否则创建该文件
    user_info_dict = {}         #定义用户信息字典     最终格式{用户名:[密码,身份证信息]}
    user_info_dict = json.dumps(user_info_dict)    #将用户信息字典转化为json类型,以便写入文件
    user_info_file = open("user_info_file", w)
    user_info_file.write(user_info_dict)       #将空字典写入用户信息文件中
    user_info_file.close()

#读取用户信息文件,将所有用户信息放在user_pass_all列表中
user_info_file = open("user_info_file", r)
user_info_all = user_info_file.read()
user_info_file.close()
user_info_all = json.loads(user_info_all)     #将json类型转换为Python原始类型


#locked_user.txt文件为锁定用户文件。用户输入三次错误的密码后将会被锁定,锁定的用户保存在locked_user.txt文件中。
if os.path.exists("locked_user_file"):   #如果存在不做任何操作
    pass
else:                                         #否则创建该文件
    locked_user_dict = {}      #定义锁用户字典       最终格式{用户名:输入密码次数}
    locked_user_dict = json.dumps(locked_user_dict)      #将锁用户字典转化为json类型,以便写入文件
    locked_user_file = open("locked_user_file", w)
    locked_user_file.write(locked_user_dict)
    locked_user_file.close()

#读取用户锁定文件,将被锁定的用户放在locked_user_all列表中
locked_user_file = open("locked_user_file", r)
locked_user_all = locked_user_file.read()
locked_user_file.close()
locked_user_all = json.loads(locked_user_all)    #将json类型转换为Python原始类型


# shop_car_file文件为用户购物车信息文件
if os.path.exists("shop_car_file"):   #如果存在不做任何操作
    pass
else:                                         #否则创建该文件
    shop_car_dict = {}         #定义购物车信息字典
    #最终格式{user1:[[商品,数量,单价,总价,购买时间],[...]],user2:{商品:[[数量,单价,总价,购买时间][...]]}}
    shop_car_dict = json.dumps(shop_car_dict)    #将购物车字典转化为json类型,以便写入文件
    shop_car_file = open("shop_car_file", w)
    shop_car_file.write(shop_car_dict)       #将空字典写入用户信息文件中
    shop_car_file.close()

#读取购物车文件,将所有购物车文件信息放在user_pass_all列表中
shop_car_file = open("shop_car_file", r)
shop_car_all = shop_car_file.read()
shop_car_file.close()
shop_car_all = json.loads(shop_car_all)     #将json类型转换为Python原始类型


# user_salary_file文件为用户余额信息文件
if os.path.exists("user_salary_file"):   #如果存在不做任何操作
    pass
else:                                         #否则创建该文件
    user_salary_dict = {}         #定义用户余额信息字典   最终格式{用户名:余额,用户名:余额}
    user_salary_dict = json.dumps(user_salary_dict)    #将用户余额字典转化为json类型,以便写入文件
    user_salary_file = open("user_salary_file", w)
    user_salary_file.write(user_salary_dict)       #将空字典写入用户信息文件中
    user_salary_file.close()

#读取用户余额信息文件,将所有用户余额信息放在user_pass_all列表中
user_salary_file = open("user_salary_file", r)
user_salary_all = user_salary_file.read()
user_salary_file.close()
user_salary_all = json.loads(user_salary_all)     #将json类型转换为Python原始类型


#writefile函数是将数据写到文件中永久保存
def writefile(File,Dict):
    fwrite = open(File,w)    #打开文件
    json.dump(Dict,fwrite)    #读取文件内容到字典中
    fwrite.close()     #关闭文件

#定义退出函数,退出时打印用户已购买商品信息及余额信息
def input_q():
    if user not in list(shop_car_all.keys()):
        print("你没有购买过任何商品")
    else:
        print(您已购买以下商品.center(100,-))
        print("\t","{:<10}".format(商品名),"{:<10}".format(件数),"{:<10}".format(单价),
              "{:<10}".format(总价),"{:<10}".format(购买时间))   #格式化输出抬头
        for num,item in enumerate(range(len(shop_car_all[user]))):
            shop_time = time.gmtime(int(shop_car_all[user][num][4]))
            shop_time = time.strftime("%Y-%m-%d %X",shop_time)    #将购买时间转化为可视化时间
            print("{:<4}".format(num+1),"{:<10}".format(shop_car_all[user][num][0]),
                  "{:<10}".format(shop_car_all[user][num][1]),"{:<10}".format(shop_car_all[user][num][2]),
                  "{:<10}".format(shop_car_all[user][num][3]),"{:<10}".format(shop_time))   #格式化输出已购买商品信息
    print(您的余额为:%d元%user_salary_all[user])
    print(欢迎下次光临.center(100,-))
    exit()

#定义显示已购买商品信息函数,打印用户已购买商品信息及余额信息
def input_c():
    if user not in list(shop_car_all.keys()):
        print("你没有购买过任何商品")
    else:
        print(您已购买以下商品.center(100,-))
        print("\t","{:<10}".format(商品名),"{:<10}".format(件数),"{:<10}".format(单价),
              "{:<10}".format(总价),"{:<10}".format(购买时间))    #格式化输出抬头
        for num,item in enumerate(range(len(shop_car_all[user]))):
            shop_time = time.gmtime(int(shop_car_all[user][num][4]))
            shop_time = time.strftime("%Y-%m-%d %X",shop_time)   #将购买时间转化为可视化时间
            print("{:<4}".format(num+1),"{:<10}".format(shop_car_all[user][num][0]),
                  "{:<10}".format(shop_car_all[user][num][1]),"{:<10}".format(shop_car_all[user][num][2]),
                  "{:<10}".format(shop_car_all[user][num][3]),"{:<10}".format(shop_time))  #格式化输出已购买商品信息
    print(您的余额为:%d元%user_salary_all[user])



#定义充值函数
def input_j():
    while True:
        recharge = input("请输入充值金额:")
        if recharge.isdigit():          #判断用户输入是否为数字
            recharge = int(recharge)
            user_salary_all[user] += recharge     #将充值后的金额写到用户余额字典中
            writefile("user_salary_file",user_salary_all)    #将更新后的信息写到用户余额文件中
            print("充值成功,你的余额为:%s元" %user_salary_all[user])
            break
        else:
            print("你的输入有误,请重新输入")
            continue


login_value = 0    #该值为登录结果值,该值有0和1两个结果,若值为0不进行购买程序,若为1代表继续下面的购买程序
exit_flag = False
while not exit_flag:
    action = [登录,注册,申诉,更改密码,退出]
    for select in enumerate(action,1):
        print(select[0],.,select[1])     #输出有哪些动作选项
    user_select = input("请输入你要选择的动作编号:")
    if user_select.isdigit():
        user_select = int(user_select)
        if user_select > 5 or user_select < 1:        #判断用户输入是否合法
            print("你的输入有误,请重新输入")
            continue
        if user_select == 1:            #若为1,进行下方的登录程序
            while not exit_flag:
                print("你只有三次输入密码的机会,若三次密码都错误,该用户将被锁定!")
                user = input("请输入用户名: ")
                passwd = input("请输入密码: ")
                if user not in list(user_info_all.keys()):    #判断用户是否存在
                    print("该用户名不存在,请重新选择")
                    break
                elif user in list(locked_user_all.keys()) and locked_user_all[user] == 3:  #如果用户在列表中,说明用户为锁定用户
                    print("该用户被锁定,请申诉")
                    break
                elif passwd != user_info_all[user][0]:     #判断用户密码是否正确
                    if user in locked_user_all.keys():   #如果用户之前有过输入密码错误记录
                        locked_user_all[user] += 1
                        writefile("locked_user_file",locked_user_all)    #将更新后的信息写入锁用户文件中
                        if locked_user_all[user] == 3:    #如果该用户密码输入错误次数等于3
                            print("该用户名已输错密码三次,被锁定,如有需要,请申诉")
                            break
                        else:
                            print("密码错误,请重新输入[该用户名已输错密码%d次,输错三次该用户名将被锁定]:" % locked_user_all[user])
                    else:    #如果用户之前没有过输入密码错误记录
                        locked_user_all.update({user:1})   #将该用户添加到锁用户列表中,次数为1
                        writefile("locked_user_file",locked_user_all)    #将更新后的信息写入到锁用户文件中
                        print("密码错误,请重新输入[该用户名已输错密码%d次,输错三次该用户名将被锁定]:" % locked_user_all[user])
                else:
                    print("欢迎访问")
                    login_value = 1    #说明用户登录成功,将login_value的值改为1
                    exit_flag = True   #退出程序
        if user_select == 2:    #若为2,说明用户要申请账号
            while not exit_flag:
                new_user = input("请输入用户名: ")
                new_passwd_one = input("请输入密码: ")
                new_passwd_two = input("请再次输入密码: ")
                user_id_info = input("请输入你的身份证号码(方便申诉):")
                if new_user in list(user_info_all.keys()):    #如果用户输入的用户名已存在
                    print("该用户名已存在,请重新输入")
                    continue
                elif new_passwd_one != new_passwd_two:   #如果用户输入的两次密码不一致
                    print("第一次和第二次密码不一样,请重新输入")
                    continue
                elif not user_id_info.isdigit():   #如果用户输入的身份证号码不为数字
                    print("请输入正确的身份证号码信息")
                    continue
                elif new_passwd_one == new_passwd_two:    #如果用户输入的两次密码一致
                    user_info_all.update({new_user:[new_passwd_one,user_id_info]})   #将新注册的用户名及密码加入到用户密码字典中
                    writefile("user_info_file", user_info_all)   #将更新的信息写入到用户信息文件中
                    print("恭喜,注册成功")
                    break
        if user_select == 3:    #若为3,说明用户要申诉
            while not exit_flag:
                appeal_user = input("请输入需要申诉的用户名:")   #该变量为用户申诉的用户名
                if appeal_user not in list(user_info_all.keys()):   #如果用户输入的用户名不在用户信息字典中
                    print("用户名不存在,请重新选择")
                    break
                elif appeal_user not in list(locked_user_all.keys()) or locked_user_all[appeal_user] < 3:   #若果用户名不在锁用户字典中或
                    print("该用户名未被锁定,请重新选择")                                                    #用户名输入密码错误的次数小于3
                    break
                elif locked_user_all[appeal_user] == 3:     #如果用户名输入密码错误的此物为3
                    appeal_id = input("请输入该用户的身份证号码:")
                    if appeal_id == user_info_all[appeal_user][1]:   #判断用户输入的身份证号码是否正确
                        del locked_user_all[appeal_user]    #若正确,在锁用户字典中删除该条记录
                        writefile("locked_user_file",locked_user_all)    #将更新后的信息写入到锁用户文件中
                        new_passwd = input("申诉成功,请输入新密码:")
                        user_info_all[appeal_user][0] = new_passwd
                        writefile("user_info_file",user_info_all)   #将用户的新密码写入到用户信息文件中
                        print("密码修改成功")
                        break
                    else:
                        print("身份证号码输入错误")
                        break
        if user_select == 4:    #若用户输入4,表明用户要改密码
            change_pass_user = input("请输入用户名:")    #该变量为用户需要改密码的用户名
            if change_pass_user not in list(user_info_all.keys()):    #如果用户名不在在用户信息字典中
                print("用户名不存在,请重新选择")
            else:
                change_pass_id = input("请输入身份证号码:")
                if change_pass_id == user_info_all[change_pass_user][1]:   #若果用户输入的身份证号码正确
                    while True:
                        change_pass_one = input("请输入新密码:")
                        change_pass_two = input("请再次输入新密码:")
                        if change_pass_one == change_pass_two:   #如果两次密码一致
                            user_info_all[change_pass_user][0] = change_pass_one    #更改用户密码
                            writefile("user_info_file",user_info_all)    #将更改的信息写入到用户信息问价中
                            print("恭喜,密码修改成功")
                            break
                        else:
                            print("两次密码输入不一样,请重新输入")
                            continue
                else:
                    print("身份证号码错误")
        if user_select == 5:    #若用户输入5,代表退出程序
            exit_flag = True
    else:
        print("你的输入有误,请重新输入")
        continue


if login_value == 0:   #如果登录结果值为0,结束程序
    exit()



if user not in list(user_salary_all.keys()):   #如果用户不在用户余额字典中
    while True:
        salary = input(输入你的工资: )     #让用户输入工资
        if salary.isdigit():         #判断用户输入是否为数字
            salary = int(salary)     #是的话转换数据类型为数字
            user_salary_all[user] = salary    #在用户余额字典中添加一对键值对
            writefile("user_salary_file",user_salary_all)   #将更新后的信息写入到用户余额文件中
            break
        elif salary == q:                   #若用户输入为‘q‘,退出程序
            exit()
        else:
            print("无效的数据类型")    #否则提示无效的数据类型
            continue



# 定义商品字典
product_dict = {"手机":
                    [(锤子手机,2500),(苹果6s,6000),(华为,3000),(小米,1500),(Vivo,3000),(oppo,3000),(Nokia,300),(摩托罗拉,150)],
                "家电":
                    [("微波炉",300),("冰箱",3000),("洗衣机",1200)]
                }

exit_flag = False
while not exit_flag:
    while not exit_flag:
        print(祝你购物愉快,以下为商品类别列表.center(100,-))
        counter = 1
        format_dict = {}   #该字典存放编号及商品类别信息,方便用户输入编号系统知道用户选择的商品类别
        for i in list(list(product_dict.keys())):
            print({0}. {1}.format(counter,i))
            format_dict[counter] = i               #将同一等级的地区信息及改地区的编号记录到字典中方便后面调用
            counter += 1
        choice_one = input("请输入你想买的商品类别的编号(输入‘q‘退出,输入‘c‘检查购物车中的商品及余额,输入‘j‘充值):")
        if choice_one.isdigit():    #判断用户输入的是否为数字
            choice_one = int(choice_one)
            if choice_one not in list(format_dict.keys()):    #如果用户输入的数字不在编号商品类别字典中
                print("你的输入有误,请重新输入")
                continue
            else:               #如果用户输入正确
                product_list = product_dict[format_dict[choice_one]]     #该变量为二级商品信息
                break
        elif choice_one == q:   #如果用户输入‘q‘,调用退出函数
            input_q()
        elif choice_one == c:    #如果用户输入‘c‘,调用显示余额及已购商品信息函数
            input_c()
        elif choice_one == j:    #如果用户输入‘j‘,调用充值函数
            input_j()
        else:
            print("你的输入有误,请重新输入")
    while True:
        print(祝你购物愉快,以下为商品列表.center(100,-))
        以上是关于Python学习day02的主要内容,如果未能解决你的问题,请参考以下文章

python学习-day02

Python学习day02

Python入门学习-DAY02

python 学习笔记day02-python循环文件函数模块

python学习点滴记录-Day02补充-文件操作

python_day02 学习知识点