python基础学习二

本文深入探讨Python的基础知识,包括模块的导入方式、sys和os模块的介绍,以及.pyc文件的原理。同时,详细阐述了Python的数据类型如int、float、bool、str、list、tuple和dict,及其相关运算和操作。文章还介绍了列表的增删改查、元组的只读特性,以及字典的查询、添加、删除和修改操作。最后,提供了三级菜单和简易购物车的实践案例。

python基础学习2

1 模块初识

2 数据类型

3 入门知识拾遗

4 列表相关操作

5 元组相关操作

6 字典相关操作

案列:三级菜单练习

1 模块初识

python的强大之处在于他有非常丰富和强大的标准库和第三方库(也可以称为模块),几乎你想实现的任何功能都有相应的python库支持。一般来说可以分为标准库和第三方库,
标准库:不需要进行额外的安装,就可以直接导入的库
第三方库:需要下载安装的库。例如:django库

模块是指一个可以交互使用,或者从另一Python 程序访问的代码段。只要导入了一个模块,就可以引用它的任何公共的函数、类或属性。模块可以通过这种方法来使用其它模块的功能。

1.1导入库的两种方式
import moduleName

用import语句导入模块,就在当前的名称空间(namespace)建立了一个到该模块的引用.这种引用必须使用全称,也就是说,当使用在被导入模块中定义的函数时,必须包含模块的名字。所以不能只使用 funcname,而应该使用 modname.funcname

from moduleName import funcName
#from moduleName import fn1,fn2,fn3
#from modlueName import *

funcname 被直接导入到本地名字空间去了,所以它可以直接使用,而不需要加上模块名的限定。直接使用funcName()即可。
“ * ”表示,该模块的所有公共对象(public objects)都被导入到 当前的名称空间,也就是任何只要不是以”_”开始的东西都会被导入。

1.2 初识sys模块
#导入模块
import sys
print(sys.path) #打印出模块所在目录的目录名列表
#sys模块时一个内嵌模块(本身是用c语言写的),所以在电脑当中的C:\python\Lib下找不到这个模块
print(sys.argv) #从程序外部获取参数的桥梁。
print(sys.argv[0]) #打印出文件所在位置的相对路径

下面是对sys.argv的详细讲解:
http://www.cnblogs.com/aland-1415/p/6613449.html

1.3 初识os模块
import os
os.system("cls")  #用这个命令可以在命令行中清空屏幕
os.system("dir")  #打印出当前目录中的文件
#但是上面的代码运行的话中文会乱码,而且此方法并不能返回什么东东
#如果想返回,可以用下面的方法
result = os.popen("dir").read
print(result) #不仅可以返回,而且中文也不会乱码

python当中的所有模块,默认在当前目录下找,如果没有找到,然后在去环境变量中去找
如果你自己想写模块,可以放到sitepackage这个目录下

1.4 .pyc是什么文件?
1.4.1 .pyc是什么?

python是一门解释型语言,那.pyc文件存在的意义又是什么呢?
pyc中的c,其实是compiled编译的

1.4.2 解释型语言和编译型语言

计算机是不能识别高级语言的,所以当我们运行一个高级语言程序的时候,就需要一个翻译机来从事把高级语言转变成计算机能读懂的机器语言的过程,这个过程分成两类,
第一种是编译
第二种是解释

编译语言在程序执行之前,先会通过编译器对程序执行一个编译的过程,把程序转变成机器语言运行时就不需要翻译,而直接运行就可以了,最典型的例子就是C语言

解释型语言就没有这个编译的过程,而是在程序运行的时候,通过解释器对程序逐行做出解释,然后直接运行,最典型的例子是ruby/python

优缺点:
编译型语言在程序运行之前就已经对程序做出了翻译,所以在运行时就少了翻译这个过程,所以效率比较高,但是我们也不能一概而论,一些解释型语言也可以通过编译器的优化来在对程序作出翻译时对整个程序作出优化,从而在效率上超过编译型语言

此外,随着Java等虚拟机语言的兴起,我们又不能把语言纯粹地分成解释型和编译型语言这两种
用java来举例,java首先是通过编译器编译成字节码文件,然后在运行是通过解释器给解释成机器文件,所以我们说java是一种先编译后解释的语言

1.4.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是伊恩
先编译后解释的语言

1.5简述python的运行过程

在说这个问题之前,我们先来说两个概念,pyCodeObject和pyc文件

我们在硬盘上看到的pyc自然不必多说,而其实pyCodeObject则是python解释器真正编译成的结果我们先简单知道就可以了,当python程序运行时,编译的结果则是保存在位于内存中的PyCodeObject中,当Python程序运行结束时,python解释器则将pyCodeObject写回到.pyc文件中

当python程序第二次运行时,首先程序会在硬盘中寻找pyc文件,如果找到,则直接写入,否则就重复上面的过程

所以我们应该这样来定位pycodeobject和pyc文件,我们说pyc文件其实是pyCodeObject的一种持久化保存方式

pyc文件和源文件会通过时间比较,会实时更新.pyc文件(c写的源程序就是这样写的)

2. 数据类型

2.1 分类

int:整形
python当中没有long(长整型)这一数据类型
float:浮点型
complex:复数类型,主要用于空气动力,量子力学等
表示形式:a + bj(和数学中的复数中的虚部i表示形式不同)

布尔值:
True/False:首字母要大写

字符串:用单引号、双引号、三引号引起来的都成为字符串

列表:[]

元组:()

字典:{}
……

2.2 运算

数字和字符串类型运算

sum = str(1) + “1” #需要把数字强转为字符串,否则会报错
print(sum) #11

数字和布尔类型进行运算

result = 1 + True
print(result) #2

可以看出,True = 1
False可以自己试一下,False = 0
……

3. 入门知识拾遗

3.1 三元运算

a, b, c = 1, 3, 5
d = a if  a > b else c

3.2 进制

在计算机中,常用的进制有:
二进制(0,1)英文binary,在计算机中简写为b
八进制 (0~7)英文octal,简写为o
十进制(0~9)英文decimal,简写为d
十六进制(0~9 A ~ F)英文为hexadecimal,简写为h
十六进制表示方式:有两种
前缀表示法:ox__
后缀表示法:__BH
进制之间的转换可以点下面链接:
https://jingyan.baidu.com/article/495ba84109665338b30ede98.html

3.3 bytes类型

字节数据类型
二进制数据(音频或者视频)都是由bytes表示
字节可以和字符相互转化
字节通过decode方法转化成字符
字符通过encode方法转化成字节
之间具体的转化,请看下面链接:
https://blog.csdn.net/xiaoeleis/article/details/81508803

4. 列表相关操作

在没有学习列表之前,我们想存储一个学校的所有学生的名字,我们应该怎么做?
声明很多个变量,来存储所有的名字(呵呵~~)
还是列表简单
names = []
names = [“John”,“Able”,“Wisdom”]

列表操作

4.1 查看列表中的元素

print(names)   #打印出列表的内容
#想取到某一个值,通过索引可以查到(从0开始)
print(names[0])  #结果为John取到第一个值
#想取多个值,要用到切片操作
print(names[0:3]) #John Able Wisdom  包头不包尾
print(names[:]
#如果不知道长度,如何取到最后一个
names[-1]

4.2 增加元素

#append方法

names.append("Dell")
print(names) #打印出列表中的内容,增加了Dell

#insert插入

names.insert(1,"Bone")

insert方法中的第一个参数为插入的索引的位置(在哪个索引下插入),第二个为插入的对象(插入什么内容)

4.3 改变元素

names[0] = "Rose"
print(names) # Rose,Albe,Wisdom

4.4 删除元素

有三种方式:
1)remove方法

names.remove("John") #如果删除的元素不存在,则会报错

2)del方法

 del names[0]

3)pop方法

names.pop() #pop后面的小括号里面如果有数字(也就是下标)就会删除相应位置的元素,如果没有指定,默认删除最后一个

4.5 循环列表

for i in names:
	print(i)  #会打印出names列表中的元素
	
for i in names[0:-1:2]:
    print(i) #会打印出第一个和第三个元素

4.6 列表的方法

(1):index()方法:返回指定元素的索引

print(names.index("John")) #返回0

(2):count()方法,统计指定元素的个数

names.count("John") #1

(3): sort()方法,排序

names.sort()#如果有字符串型的数字,有大小写的,会按照:先是字符串型的数字:“1”,“2”……然后小写字母,最后大写字母,按照26个英文字母的顺序进行排序

(4): reverse()方法进行翻转

names.reverse() #将列表进行翻转,原先在第一个位置的现在到最后一个位置

(5): clear() 清空列表

names.clear() # 列表中空空如也

(6):extend() 扩展列表

names.extend(names2) #把names2列表加入到names当中

(7):copy() 浅复制

name = names.copy()
id(names) #1946793232648
id(name) #1946793232520
#由此可见,复制的这一份,它的内存地址是不一样的
names[0] = "Belt"
print(name) #name还是原来的,并没有发生任何改变

为什么叫浅copy呢?

names = [["A","Aven"],"Bell","Ceval"]
name = names.copy()
names[0][0] = "Rose"
print(names) #[["Rose","Aven"],"Bell","Ceval"]
print(name) #[["Rose","Aven"],"Bell","Ceval"]
#这就是浅copy,只复制第一层,第二层不做复制,如果想复制第二层,就需要用copy模快中的deepcopy()方法
import copy
name1 = copy.deepcopy(names)
names[0][0] = "Rose"
print(names) #[["Rose","Aven"],"Bell","Ceval"]
print(name) #[["A","Aven"],"Bell","Ceval"]

5 元组相关操作

元组的英文名字:tuple
元组不能修改,所以又叫只读列表
表示形式:names = ()
元组只有两个方法:count()方法,index()方法,使用方法和列表一样一样的

6 字典的相关操作

表示形式:dict1 = {“stu1”:“A”,“stu2”:“B”,“stu3”:“C”}
一个元素由两个部分组成:key:value
字典是无序的

6.1 字典查询
print(dict1["stu1"]) # A
print(dict1["stu4"]  #报错
#可以用这种方法
print(dict1.get("stu4")
#没有则返回None,有则返回相对应的value值
6.2 增加元素
dict1["stu4"] = "D"
print(dict1) #这样就把stu4添加进去了
6.3 删除元素
dict1.pop("stu1")
print(dict1) # {'stu2': 'B', 'stu3': 'C', 'stu4': 'D'}
del dict1["stu2"]
print(dict1) # {'stu3': 'C', 'stu4': 'D'}
6.4 改变元素的值
dict1["stu1"] = "a"
print(dict1)
6.5 键是否存在

print(“stu1” in dict1) #True

6.6 字典的其他操作
(1): dict1.values()  #返回一个可迭代values的对象
(2): dict1.keys()  #返回一个可迭代的key的对象
(3):dict1.setdefault("stu4","E") #如果没有则创建,如果有则不改变任何值
	 print(dict1)
(4):dict1.items() #把字典转化成列表
(5): #循环字典
for i in dict1:
	pirnt(i) # 打印出字典的键
for i in dict1:
	print(i,dict1[i]) #打印出键值对
#或者可以这样用
for k,v in dict1.items():
	print(k,v) #同样可以打印出键值对。
#建议用第一种方式,不建议用第二种方式。

案例

1. 三级菜单案例
data = {
    '北京':{
        '昌平':{
            "沙河":["good","angle"],
            "天通苑":["我爱我家","lian家"]
        },
        '朝阳':{
            "望京":["奔驰","momo"],
            "国贸":["中金","惠普"],
            "东直门":["飞信","飞鸽"]
        },
        '海淀':{

        }
    },
    '山东':{
        '德州':{},
        '青岛':{},
        '济南':{}
    },
    '广东':{
        '东莞':{},
        '常熟':{},
        '佛山':{}
    }
}

exit_flag = False
while not exit_flag:
    print("选择你想查看的地区,按b返回上一级,按q退出")
    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返回上一层,按q退出")
                        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
    if choice == "q":
        exit_flag = True
2. 简易购物车

‘’‘购物车程序
需求:
1.启动程序后,让用户输入工资,然后打印商品列表
2.允许用户根据商品编号购买商品
3.用户选择商品后,检测余额是否够,够就直接扣款,不够就提醒
4.可随时退出,退出时,打印已经购买商品和余额
‘’’

goods_list = [
    ["Iphone", 5800],
    ["IWatch", 10600],
    ["Mac Pro", 13000],
    ["coffee", 58],
    ["python book", 80],
    ["bicycle", 800]
]
shopping_list = []
    
salary = input("your salary is:")

if salary.isdigit():
    salary = int(salary)
    while True:
        for index, item in enumerate(goods_list):
            # print(goods_list.index(item),item)  #比这个方法更好的一种方法
            print(index, item)
        user_choice = input("选择你要购买的产品序号:>>>")
        if user_choice.isdigit():
            user_choice = int(user_choice)
            if user_choice < len(goods_list) and user_choice >= 0:
                p_item = goods_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:",salary)
            exit()
        else:
            print("invalid option")
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值