作者:赵俊            发布日期:2019/11/5

一、模块初识

import sys
'''默认在当前目录下找模块,找不到再去python环境变量中寻找'''
print(sys.path)#打印环境变量
print(sys.argv)#是一个参数列表,这个列表存放着从外界获取到的参数(可能有多个)
import os

#cmd_res = os.system("dir")#执行命令,不保存结果,输出到屏幕
#print(cmd_res)#返回0代表执行成功,返回1代表执行失败 cmd_res = os.popen("dir").read() #执行命令,将结果保存在内存中,要取回内容用read方法
print(cmd_res)
os.mkdir("zj")#当前目录下创建一个zj目录

二、pyc是什么

1. Python是一门解释型语言?

我初学Python时,听到的关于Python的第一句话就是,Python是一门解释性语言,我就这样一直相信下去,直到发现了*.pyc文件的存在。如果是解释型语言,那么生成的*.pyc文件是什么呢?c应该是compiled的缩写才对啊!

为了防止其他学习Python的人也被这句话误解,那么我们就在文中来澄清下这个问题,并且把一些基础概念给理清。

 

2. 解释型语言和编译型语言

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

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

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

通过以上的例子,我们可以来总结一下解释型语言和编译型语言的优缺点,因为编译型语言在程序运行之前就已经对程序做出了“翻译”,所以在运行时就少掉了“翻译”的过程,所以效率比较高。但是我们也不能一概而论,一些解释型语言也可以通过解释器的优化来在对程序做出翻译时对整个程序做出优化,从而在效率上超过编译型语言。

此外,随着Java等基于虚拟机的语言的兴起,我们又不能把语言纯粹地分成解释型和编译型这两种。

用Java来举例,Java首先是通过编译器编译成字节码文件,然后在运行时通过解释器给解释成机器文件。所以我们说Java是一种先编译后解释的语言。

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是一门先编译后解释的语言。

4. 简述Python的运行过程

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

我们在硬盘上看到的pyc自然不必多说,而其实PyCodeObject则是Python编译器真正编译成的结果。我们先简单知道就可以了,继续向下看。

当python程序运行时,编译的结果则是保存在位于内存中的PyCodeObject中,当Python程序运行结束时,Python解释器则将PyCodeObject写回到pyc文件中。

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

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

三、python的基本数据类型

1、数字

2 是一个整数的例子。
长整数 不过是大一些的整数。
3.23和52.3E-4是浮点数的例子。E标记表示10的幂。在这里,52.3E-4表示52.3 * 10-4。
(-5+4j)和(2.3-4.6j)是复数的例子,其中-5,4为实数,j为虚数,数学中表示复数是什么?。

int(整型)

  在32位机器上,整数的位数为32位,取值范围为-2**31~2**31-1,即-2147483648~2147483647
  在64位系统上,整数的位数为64位,取值范围为-2**63~2**63-1,即-9223372036854775808~9223372036854775807
long(长整型)
  跟C语言不同,Python的长整数没有指定位宽,即:Python没有限制长整数数值的大小,但实际上由于机器内存有限,我们使用的长整数数值不可能无限大。
  注意,自从Python2.2起,如果整数发生溢出,Python会自动将整数数据转换为长整数,所以如今在长整数数据后面不加字母L也不会导致严重后果了。
float(浮点型)
      先扫盲 http://www.cnblogs.com/alex3714/articles/5895848.html 
  浮点数用来处理实数,即带有小数的数字。类似于C语言中的double类型,占8个字节(64位),其中52位表示底,11位表示指数,剩下的一位表示符号。
complex(复数)
  复数由实数部分和虚数部分组成,一般形式为x+yj,其中的x是复数的实数部分,y是复数的虚数部分,这里的x和y都是实数。
注:Python中存在小数字池:-5 ~ 257
 
2、布尔值
  真或假
  1 或 0
  True或False(首字母大写)
3、字符串
"hello world"
万恶的字符串拼接:
  python中的字符串在C语言中体现为是一个字符数组,每次创建字符串时候需要在内存中开辟一块连续的空,并且一旦需要修改字符串的话,就需要再次开辟空间,万恶的+号每出现一次就会在内从中重新开辟一块空间。
字符串格式化输出
1
2
3
4
name = "alex"
print "i am %s " % name
  
#输出: i am alex

PS: 字符串是 %s;整数 %d;浮点数%f

字符串常用功能:
  • 移除空白
  • 分割
  • 长度
  • 索引
  • 切片
4、列表
创建列表:

1
2
3
name_list = ['alex''seven''eric']
name_list = list(['alex''seven''eric'])

基本操作:

  • 索引
  • 切片
  • 追加
  • 删除
  • 长度
  • 切片
  • 循环
  • 包含
5、元组(不可变列表)
创建元组:
1
2
3
ages = (1122334455)
ages = tuple((1122334455))
 
6、字典(无序)
创建字典:
1
2
3
person = {"name""mr.wu"'age'18}
person = dict({"name""mr.wu"'age'18})

常用操作:

  • 索引
  • 新增
  • 删除
  • 键、值、键值对
  • 循环
  • 长度

7、bytes数据类型

python3里不会以任何隐式的方式混应str和bytes

字符串可以编码成字节包,字节包可以解码成字符串

msg = "我爱北京天安门"
msg = msg.encode("utf-8")
print(msg)
msg = b'\xe6\x88\x91\xe7\x88\xb1\xe5\x8c\x97\xe4\xba\xac\xe5\xa4\xa9\xe5\xae\x89\xe9\x97\xa8'
msg = msg.decode("utf-8")
print(msg)

四、列表的使用

 #Author:ZHJ
names = ["唐僧","孙悟空","猪八戒","沙和尚","白龙马","白骨精","蜘蛛精","牛魔王","沙和尚"]
#查询
print(names)
print(names[0]) #取出列表中对应索引的内容
print(names[4:6]) #切片,范围取值(左取右不取原则)
print(names[-1]) #从右边取
print(names[-3:]) #倒数第三个往后所有
print(names.index("白龙马")) #返回指定内容的索引,查询不到报错
print(names.count("沙和尚")) #查询指定内容的元素个数 #增加
names.append("蜈蚣精") #添加到列表的最末端
names.insert(2,"蛤蟆精") #插入到指定索引的位置,其他元素往后移动
print(names) #改动
names[0] = "唐三藏" #改动指定索引的元素内容
names.reverse() #翻转列表
names.sort() #排序
print(names) #删除
names.remove("蛤蟆精") #删除指定内容的元素,其他元素自动挪动
del names[0] #删除指定索引的元素,其他元素自动挪动
names.pop() #删除指定索引的元素,其他元素自动挪动,不指定索引,默认删除最后一个
#names.clear() #清除列表
#del names #删除列表这个变量
print(names) names2 = [1,2,3,4]
names.extend(names2) #合并两个列表
print(names)

复制功能使用较少

列表的copy是浅复制,只复制第一层

如果要深复制,就要导入模块copy,然后使用names2 = copy.deepcopy(names)

列表循环

for i in names:
print(i)

五、元祖和购物车程序

元组其实跟列表差不多,也是存一组数,只不是它一旦创建,便不能再修改,所以又叫只读列表

语法:names = ("a","b","c")

它只有2个方法,一个是count,一个是index

购物车程序

 #Author:ZHJ
commodity = [["iphone11",6889],["guitar",2450],["mac book",12000],["ipod",688],["ipad",2889]]
seleted = []
total = 0
while True:
salary = input("请输入你的余额:")
if salary.isdigit():
salary = int(salary)
break
else:
print("\033[33;7m输入非法,请输入数字!\033[0m")
while True:
for i in commodity:
print("%s、%s"%(commodity.index(i),i))
num = input("输入商品编号,回车加入购物车;输q确认购买退出")
if num.isdigit():#输入的商品编号是数字
num = int(num)#字符串强制转整型
if num < len(commodity):#保证输入的编号在范围内
print("商品" + commodity[num][0] + "加入购物车")
seleted.append(commodity[num])#选择商品加入购物车
else:
print("你输入的编号不在库里")
else:#输入的不是数字
if num == "q":
for i in seleted:
total = total + i[1]
if total <= salary:
salary = salary-total
print("已购买商品",seleted)
print("余额为:\033[31;1m%s\033[0m"%(salary))
break
else:
print("余额不足,重新选择商品")
seleted.clear()#清空购物车,从新选择
total = 0#清空总价格

六、字符串常用操作

 #Author:ZHJ
#带下划线的方法都是内部的,我们无法使用
name = "hello world"
print(name.capitalize()) #字符串第一个字母大写
print(name.count("l")) #统计字符串包含几个指定字符
print(name.center(50,"*")) #总共50个字符,不够用指定字符填充,并且字符串居中
print(name.endswith("ld")) #判断字符串是否以指定字符结尾,返回True或False
print(name.find("w")) #查找指定字符或字符串,在源字符串中开始位置的索引
name = "hello world {age}"
print(name.format(age = 23)) #格式化字符串
print(name.format_map({"age" : 23})) #格式化字符串,用字典的方式
name = "helloworld在"
print(name.isalnum()) #是否包含特殊字符,包含为False,反之为True
print(name.isalpha()) #是否包含特殊字符和数字,包含为False,反之为True
name = "#¥@%@%@w"
print(name.isdecimal()) #是否是十进制
print(name.isdigit()) #是否是整数
print(name.isidentifier())#判断是否是一个合法的标识符(变量名)
print(name.islower()) #是否是小写
print("DFS".isupper()) #是否为大写
print(" 1 ".isspace()) #判断是不是空格
print("Hello World".istitle()) #判断是不是标题,每个单词首字母大写就是标题
print("*".join(["","","",""])) #用指定字符拼接列表
print("hello world".ljust(50,"$")) #从左数指定数量字符,不够在右边填充指定字符
print("hello world".rjust(50,"$")) #从右数指定数量字符,不够在左边填充指定字符
print("SDASSAF".lower()) #把大写变小写
print("ssafsf".upper()) #把小写变大写
print(" qwe".lstrip()) #去除字符串左边空格和回车
print("qwe ".rstrip()) #去除字符串右边空格和回车
print("ss ".strip()) #去除字符串两边空格和回车
p = str.maketrans("abcdefghijklm","~!@#$%^&*()_+") #后面字符替换前面字符显示
print("abefmlj".translate(p)) print("assfffad".replace("a","A",1)) #将a替换成A只替换指定个数
print("dfjlhkjl".rfind("l")) #查找最右边那个指定字符,返回索引
print("1+2+3+4".split("+")) #以指定字符分割字符串为列表
print("".splitlines()) # 以换行符来分割字符串为列表
print("FFFfsf".swapcase()) #大写转小写,小写转大写
print("hello world".title()) #将字符串变成title
print("".zfill(8)) #指定字符串长度,不够用0填充

七、字典的使用

#Author:ZHJ
info = {
"":"孙悟空",
"":"猪八戒",
"":"沙和尚"
}
print(info)
info[""] = "白骨精"
info[""] = "蜘蛛精"
print(info)
del info[""]
print(info)
info.pop("")
print(info)
print(info.get("")) #查找,有就返回,没有就none
print("" in info) #判断一个键是否在字典中
print(info.values()) #打印所有值
print(info.keys()) #打印所有键
print(info.setdefault("","牛魔王")) #如果有对应的键,则返回相应的值,如果没有对应的键,则增加一个在字典中,并返回增加的值
print(info)
b = {1:2,2:3,"":"唐僧"}
info.update(b) #合并字典,有相同键就更改,没有就添加
print(info)
print(info.items()) #字典转列表
c = dict.fromkeys([1,2,3],["test",{"name":"jeck"}]) #初始化一个字典,在这种情况下,有多层的情况下,更改一个数据,其他也更改
c[2][1]["name"] = "test1"
print(c) #字典的循环
info = {
"":"孙悟空",
"":"猪八戒",
"":"沙和尚"
}
for i in info:
print(i,info[i])

八、作业

购物车程序优化

用户入口:

  1、商品信息存在文件里

  2、已购商品,余额记录,订单存储(第一次进入,需要记录余额)

商家入口:

  1、可以添加商品,修改商品价格

流程图:

  

代码:

 #Author:ZHJ
commodity = []
seleted = []
total = 0
userinfo = []
balance = 0
while True:
commodity.clear()
flag = input("请确认是否为买家(y/n)?")
if flag == "n":
# print("卖家")
signature = input("请输入特征码:")
if signature != "n":
print("特征码错误!")
continue
else:
file = open("commodity.txt") # 读取文件
temp = file.read().splitlines() # 以换行为分割符分割为列表
file.close()
for i in temp:
commodity.append(i.split("-"))
for i, j in enumerate(commodity):
print("%s、%s ---> ¥%s" % (i, j[0], j[1]))
name = input("请输入商品名:")
price = 0
while True:
temp = input("请输入价格:")
if temp.isdigit():
price = temp
break
else:
print("输入价格有误!")
continue
# 判断是修改还是增加
for i in commodity:
if i[0] == name:
i[1] = price
break
else:
commodity.append([name, price])
temp = ""
for i in commodity:
# print(i)
temp = temp + i[0]+"-"+i[1] + "\n"
# print(temp)
file = open("commodity.txt","w") # 读取文件
file.write(temp) # 以换行为分割符分割为列表
file.close()
break
elif flag == "y":
file = open("user.txt") # 读取文件
temp = file.read().splitlines() # 以换行为分割符分割为列表
file.close()
for i in temp:
userinfo.append(i.split("-"))
# print(userinfo)
user = input("请输入用户名:")
for i in userinfo:
if i[0] == user:
balance = i[1]
break
else:
balance = input("请输入余额!")
userinfo.append([user, balance])
# *************将添加的用户信息写入文件***************
temp = ""
for i in userinfo:
# print(i)
temp = temp + i[0] + "-" + i[1] + "\n"
# print(temp)
file = open("user.txt", "w") # 读取文件
file.write(temp) # 以换行为分割符分割为列表
file.close()
# *************将添加的用户信息写入文件***************
print("总余额为:%s" % (balance))
# ****************读取商品文件,并打印在屏幕****************
file = open("commodity.txt") # 读取文件
temp = file.read().splitlines() # 以换行为分割符分割为列表
file.close()
for i in temp:
commodity.append(i.split("-"))
for i, j in enumerate(commodity):
print("%s、%s ---> ¥%s" % (i, j[0], j[1]))
# **********************************************************
while True:
num = input("请选择商品编号或按q退出:")
if num == "q":
if total <= int(balance):
balance = int(balance) - total
file = open("user.txt") # 读取文件
temp = file.read().splitlines() # 以换行为分割符分割为列表
file.close()
userinfo.clear()
for i in temp:
userinfo.append(i.split("-"))
for i in userinfo:
if i[0] == user:
i[1] = balance
break
# *************将消费后的用户信息写入文件***************
temp = ""
for i in userinfo:
# print(i)
temp = temp + i[0] + "-" + str(i[1]) + "\n"
file = open("user.txt", "w") # 读取文件
file.write(temp) # 以换行为分割符分割为列表
file.close()
# *************将消费后的用户信息写入文件***************
# print(userinfo)
print("可以购买")
break
else:
print("用户余额不足")
else:
total = 0 # 每次添加商品时,清除总价
if num.isdigit() and int(num) <= len(commodity):
seleted.append(commodity[int(num)])
# ************求已选列表中的商品价格总和**************
for i in seleted:
total = total + int(i[1])
# ************求已选列表中的商品价格总和**************
print(seleted)
print(total)
else:
print("输入非法数据") else:
print("键盘输入错误!")

需要创建两个txt文件如下格式

不用函数,真心乱

day2(老男孩-Python3.5-S14期全栈开发)的更多相关文章

  1. day1(老男孩-Python3.5-S14期全栈开发)

    作者:赵俊            发布日期:2019/10/18 一.第一个python程序 1.在解释器下写hello world程序运行,与运行外部文件方法 运行外部文件,必须在相应位置创建一个p ...

  2. 老男孩python3.5全栈开发第9期+课件笔记(1-15部全 共125天完整无加密)

    点击了解更多Python课程>>> 老男孩python3.5全栈开发第9期+课件笔记(1-15部全 共125天完整无加密)大小:236G 此课程为老男孩全栈开发最新完结课程,适合零基 ...

  3. 老男孩Python高级全栈开发工程师三期完整无加密带课件(共104天)

    点击了解更多Python课程>>> 老男孩Python高级全栈开发工程师三期完整无加密带课件(共104天) 课程大纲 1.这一期比之前的Python培新课程增加了很多干货:Linux ...

  4. python全栈开发-Day2 布尔、流程控制、循环

    python全栈开发-Day2 布尔 流程控制 循环   一.布尔 1.概述 #布尔值,一个True一个False #计算机俗称电脑,即我们编写程序让计算机运行时,应该是让计算机无限接近人脑,或者说人 ...

  5. 老男孩Python高级全栈开发工程师【真正的全套完整无加密】

    点击了解更多Python课程>>> 老男孩Python高级全栈开发工程师[真正的全套完整无加密] 课程大纲 老男孩python全栈,Python 全栈,Python教程,Django ...

  6. 老男孩最新Python全栈开发视频教程(92天全)重点内容梳理笔记 看完就是全栈开发工程师

    为什么要写这个系列博客呢? 说来讽刺,91年生人的我,同龄人大多有一份事业,或者有一个家庭了.而我,念了次985大学,年少轻狂,在大学期间迷信创业,觉得大学里的许多课程如同吃翔一样学了几乎一辈子都用不 ...

  7. Python全栈开发第二期课表

     day01-python 全栈开发-基础篇                 01 开课介绍 01:55:13 ★  02 开课介绍02 01:28:31 ★  03 开课介绍03 00:22:55 ...

  8. python全栈开发 生成器 :生成器函数,推导式及生成器表达式

    python 全栈开发 1.生成器函数 2.推导式 3.生成器表达式 一.生成器函数 1.生成器: 生成器的本质就是迭代器 (1)生成器的特点和迭代器一样.取值方式和迭代器一样(__next__(), ...

  9. Python全栈开发【面向对象进阶】

    Python全栈开发[面向对象进阶] 本节内容: isinstance(obj,cls)和issubclass(sub,super) 反射 __setattr__,__delattr__,__geta ...

随机推荐

  1. ElasticJob-分布式作业调度神器,你们还在用Quartz吗?!

    简介 Elastic-Job是一个分布式调度解决方案,由两个相互独立的子项目Elastic-Job-Lite和Elastic-Job-Cloud组成. Elastic-Job-Lite定位为轻量级无中 ...

  2. Django的日常-模型层(1)

    目录 Django的日常-模型层(1) 模型层 django测试环境 ORM查询 Django的日常-模型层(1) 模型层 模型层其实就是我们应用名下的models.py文件,我们在里面写入想要创建的 ...

  3. 【CF888G】Xor-MST

    题目 也不是很知道为什么这道题要和某\(B\)姓算法扯上关系 首先有一个非常显然基于那个\(B\)姓算法的做法,每次启发式合并\(trie\)即可,复杂度是\(O(n\ logn\ loga_i)\) ...

  4. python语句结构(if判断语句)

    一.python语句结构分类 条件控制语句:if 语句 if....elif语句 if嵌套 循环语句:while语句    for循环 控制语句:break.continue.pass语句 二.pyt ...

  5. JS规则 表达出你的想法(表达式) 通常包括常数和变量 var num2 = num1+6;

    表达出你的想法(表达式) 表达式与数学中的定义相似,表达式是指具有一定的值.用操作符把常数和变量连接起来的代数式.一个表达式可以包含常数或变量. 我们先看看下面的JavaScript语句: 生活中&q ...

  6. JS规则 给变量取个名字(变量命名) 必须以字母、下划线或美元符号开头;区分大小写;不允许使用JS关键字或保留字

    给变量取个名字(变量命名) 我们为了区分盒子,可以用BOX1,BOX2等名称代表不同盒子,BOX1就是盒子的名字(也就是变量的名字). 我们赶快给变量取个好名字吧!变量名字可以任意取,只不过取名字要遵 ...

  7. memcache 使用手册

    Memcached 教程 Memcached是一个自由开源的,高性能,分布式内存对象缓存系统. Memcached是以LiveJournal旗下Danga Interactive公司的Brad Fit ...

  8. 宽域POST提交数据

    小数据宽域可以使用jsonp,但是大数据跨域必须post那么有以下2种方式 1,传统方式 动态生成form var url = ''var $iframe = $("<iframe s ...

  9. [JZOJ3168] 【GDOI2013模拟3】踢足球

    题目 描述 题目大意 有两个队伍,每个队伍各nnn人. 接到球的某个人会再下一刻随机地传给自己人.敌人和射门,射门有概率会中. 每次射门之后球权在对方111号选手. 某个队伍到了RRR分,或者总时间到 ...

  10. 模拟+贪心——cf1131E

    超级恶心的题,写了好久,直接倒序模拟做,但是网上有博客好像是直接正序dp做的.. 因为左端点和右端点是永远不会变的,然后情况要考虑全 /* 从后往前插 只要记录左连续,右连续,中间连续 左端点一定是L ...