变量
1、什么是变量:变量即变化的量,核心是‘变’与‘量’二字,变即变化,量即衡量状态。
2、为什么要有变量:程序执行的本质就是一系列状态的变化,变是程序执行的直接体现,所以我们需要有一种机制能够反映或者说是保存下来程序执行
时状态以及状态的变化。
3、如何定义变量:变量名(相当于门牌号,指向值所在的空间)等号 变量值 name = 'egon' 先定义、后使用
4、变量的定义规范:1、变量名只能是字母、数字或下划线的任意组合,2、变量名的第一个字符不能是数字,3、关键字不能声明为变量名
5、定义方式:驼峰体Age = 56 下划线:age_of_old = 56
6、定义变量名不好的方式:中文、拼音、变量名过行,名词不达意。 变量名最好就是见名知意。
7、等号比较的是value, is比较的是id 1、id相同,意味着type和value必定相同 2、value相同type肯定相同,但id可能不同
8、变量值的三大特性:id(变量内存中的唯一编号,内存地址不同id肯定不同) type(变量值的类型) value(变量值)
小整数池(就是一种优化机制)
python实现int的时候有个小整数池。为了避免因创建相同的值而重复申请内存空间所带来的效率问题 ,python解释器会在启动时创建出
小整数池,该范围内的小整数对象是全局解释器范围内被得复使用的,不会被回收
常量
1、什么是常量:指程序运行过程中不会改变的量
2、为什么要有常量:在程序运行过程中,有些值是固定的、不应该被改变,比如圆周率
3、怎么使用常量:python中没有一个专门的语法定义常量,所以单从语法层面去讲,常量的使用与变量完全一致。
用户与程序交互
ATM机让用户输入金额用 input:('python3中用户输入任何值,都存成字符串类型':).strip() #去两边空格strip()
1、什么是与用户交互:指人往计算机中input输入数据,计算机print输出结果。
2、为什么要与用户交互:为了让计算机能够像人一样与用户沟通交流
3、如何与用户交互:输入input(),输出print()
输出之格式化输出:
1、什么是格式化输出:把一段字符串里面的某些内容替换掉之后再输出,就是格式化输出。
2、为什么要格式化输出:输出具有某种固定格式的内容
3、如何格式化输出:占位符,%s 、%d:
%s:可以接收任意类型的值
%d: 只能接收数字
算术运算符
比较运算符
赋值运算符
python语法中除了有=号这种简单的赋值运算外,还支持增量赋值、链式赋值、交叉赋值、解压赋值,这些赋值运算符存在的意义都是为了让我们的代码看起来更加精简。我们以x=9,y=2为例先来介绍一下增量赋值
增量赋值
链式赋值
如果我们想把同一个值同时赋值限位开关多个变量名,可以这么做
z=10 y=z x=y x=y=z =10
交叉赋值
定义两个变量m与n
m=10 n=20 m,n=n,m
解压赋值
想把列表中的多个值取出来依次赋值给多个变量名,解压赋值,等号左边的变量名个数必须与右面包含值的个数相同,否则会报错
nums=[11,22,33,44,55] a,b,c,d,e=nums
但如果只想取头尾的几个值 ,可以用*-匹配 a,b,*_=nums 字符串、字典、元组、集合类型都支持解压赋值
逻辑运算符
用于连接多个条件,进行关联判断,会返回布尔值True或False
and 两个条件同时成立时返回True,但凡有一个条件为False则返回False
or 两个条件但凡有一个成立就返回True,只有在两个条件同时为False时才返回False
not取反
优先级 not > and > or
成员运算符
in 某一个对象包含于另外一个对象则返回True
not in某一对象没有包含于另外一个对象则返回True 推荐使用no in语名更加明确
身份运算符
is:比较的是id,两个对象的id相同则返回True '=='号比较的是value是否相等
is not:在两个对象的id不同时is not会返回True
注释
加注释让代码清晰明了:分为单行和多行注释,单行注释用# , 多行注释用'''''' 或""" """
基本数据类型
1、什么是数据? 数据即变量的值,如age=18,18则是我们保存的数据。
2、为何要有多种类型的数据? 变量是为了让计算机能够像人一样去记忆事物的某种状态,而变量的值就是用来存储事物状态的,很明显事物的状态分成不同种类的(比如人的年龄,身高,职位,工资等等),所以变量值也应该有不同的类型。
1、数字:
int(整型):定义age = 10 age = int(10)
用于标识:年龄、等级,身份证号、个数
float浮点型:定义:slary=3.1
用于标识:工资,身高,体重
2、字符串str
加了引号的字符就是字符串类型,定义:name = 'lili' #name=str('lili')
用于标识:描述性的内容,如姓名,性别,国国籍,种族
用单引号、双引号、多引号,都可以定义字符串,本质上是没有区别的
(数字可以进行加减乘除等运算,字符串也可以,但只能进行相加和相乘运算) name+age 其实就是拼接字符串 name*5 相乘相当于将字符串相加了5次
3、列表(list)
作用:如果需要用一个变量记录多个学生的姓名,用数字类型是无法实现,字符串类型确实可以记录下来
定义: 在[ ]内用逗号分陨,可以存放n个任意类型的值,stu_name=['egon','tank','lili']
列表可以嵌套,嵌套取值如下 >>> students_info=[['tony',18,['jack',]],['jason',18,['play','sleep']]] >>> students_info[0][2][0] #取出第一个学生的第一个爱好 'play'
4、字典dict
作用:我们需要用一个变量记录多个值,但多个值是不同属性的,比如人的姓名、年龄、身高,字典类型是用key:value形式来存储数据
定义:用key来对应值,key可以对值有描述性的功能,通常为字符串类型 stu_info = {'name':'egon','age':18,'height:185}
字典可以嵌套,嵌套取值如下 >>> students=[ ... {'name':'tony','age':38,'hobbies':['play','sleep']}, ... {'name':'jack','age':18,'hobbies':['read','sleep']}, ... {'name':'rose','age':58,'hobbies':['music','read','sleep']}, ... ] >>> students[1]['hobbies'][1] #取第二个学生的第二个爱好
5、布尔bool
作用:用来记录真假这两种状态
定义:布尔值,一个True,一个False
布尔类型就模拟人的逻辑运行,即判断一个条件成立时,用True标识,不成立则用False标识,通常用来当作判断的条件,在if判断中用
注意:None,0,空(空字符串,空列表,空字典等)值为false
垃圾回收机制(GC)
1、什么是垃圾回收机制:是python解释器自带一种机制,专门用来回收不可用的变量值所占用的内存空间。
2、为什么要用垃圾回收机制:程序运行过程中会申请大量的内存空间,而对于一些无用的内存空间如果不及时清理的话会导致内存使用殆尽
(内存溢出),导致程序崩溃,python解释器自带垃圾回收机制。
内存中的两块区域:
堆区:变量值存放于堆区,内存管理回收的则是堆区的内容
栈区:变量名与值内存地址的关联关系存放于栈区
直接引用与间接引用
直接引用:指的是从栈区出发直接引用到的内存地址。
间接引用:指的是从栈区出发引用到堆区后,再通过进一步引用才能到达的内存地址。
GC模块主要运用了引用计数,来跟踪和回收垃圾。在引计数的基础上,还可以通过标记-清除,解决容器对象可能产生的循环引用的问题 ,并且通过分代回收以空间换取时间的方式来进一步提高垃圾回收的效率。
1、引用计数:变量值被变量名关联的次数 ,引用计数一但变为0,其占用的内存地址就应该被解释器回收
2、标记清除:解决循环引用的问题,是当应用程序可用的内存空间被耗尽时,就会停止整个程序,然后进行两项工作,第一是标记,第二是清除
流程控制
1、什么是分支结构:就是根据条件判断的真假支执行不同分支对应的子代码
2、为什么要用分支结构:要根据条件来决定做什么事情
3、如何使用分支结构:
if 条件1:
代码1
代码2
elif 条件2:
代码3
代码4
elif 条件3:
代码5
代码6
else:
代码7
代码8
循环结构
1、什么是循环结说构:循环结构就是重复执行某段代码块
2、为什么要用循环结构:要重复做某件事情,控制计算机具备人的这种循环做事能力
3、如何使用循环结构
1、while循环语法又称为条件循环
while 条件:
代码1
代码2
代码3
while的运行步骤:
步骤1:如果条件为真,那么依次执行:代码1、2、3......
步骤2:执行完毕后再次判断条件,如果条件为True则再次执行:代码1、2、3.....如果条件为False终止循环
用户认证程序的基本逻辑就是接收用户输入的用户名密码然后与程序中存放的用户名密码进行判断,判断成功则登陆成功,判断失败则输出账号或密码错误 username = "jason" password = "123" inp_name = input("请输入用户名:") inp_pwd = input("请输入密码:") if inp_name == username and inp_pwd == password: print("登陆成功") else: print("输入的用户名或密码错误!") #通常认证失败的情况下,会要求用户重新输入用户名和密码进行验证,如果我们想给用户三次试错机会,本质就是将上述代码重复运行三遍,你总不会想着把代码复制3次吧。。。。 username = "jason" password = "123" # 第一次验证 inp_name = input("请输入用户名:") inp_pwd = input("请输入密码:") if inp_name == username and inp_pwd == password: print("登陆成功") else: print("输入的用户名或密码错误!") # 第二次验证 inp_name = input("请输入用户名:") inp_pwd = input("请输入密码:") if inp_name == username and inp_pwd == password: print("登陆成功") else: print("输入的用户名或密码错误!") # 第三次验证 inp_name = input("请输入用户名:") inp_pwd = input("请输入密码:") if inp_name == username and inp_pwd == password: print("登陆成功") else: print("输入的用户名或密码错误!") #即使是小白的你,也觉得的太low了是不是,以后要修改功能还得修改3次,因此记住,写重复的代码是程序员最不耻的行为。 #那么如何做到不用写重复代码又能让程序重复一段代码多次呢? 循环语句就派上用场啦(使用while循环实现) username = "jason" password = "123" # 记录错误验证的次数 count = 0 while count < 3: inp_name = input("请输入用户名:") inp_pwd = input("请输入密码:") if inp_name == username and inp_pwd == password: print("登陆成功") else: print("输入的用户名或密码错误!") count += 1
while+break的使用
使用了while循环后,代码确实精简多了,但问题是用户输入正确的用户名密码以后无法结束循环,那如何结束掉一个循环呢?这就需要用到break了!
username = "jason" password = "123" # 记录错误验证的次数 count = 0 while count < 3: inp_name = input("请输入用户名:") inp_pwd = input("请输入密码:") if inp_name == username and inp_pwd == password: print("登陆成功") break # 用于结束本层循环 else: print("输入的用户名或密码错误!") count += 1
案例三:while循环嵌套+break
如果while循环嵌套了很多层,要想退出每一层循环则需要在每一层循环都有一个break
username = "jason" password = "123" count = 0 while count < 3: # 第一层循环 inp_name = input("请输入用户名:") inp_pwd = input("请输入密码:") if inp_name == username and inp_pwd == password: print("登陆成功") while True: # 第二层循环 cmd = input('>>: ') if cmd == 'quit': break # 用于结束本层循环,即第二层循环 print('run <%s>' % cmd) break # 用于结束本层循环,即第一层循环 else: print("输入的用户名或密码错误!") count += 1
while循环嵌套+tag的使用 针对嵌套多层的while循环,如果我们的目的很明确就是要在某一层直接退出所有层的循环,其实有一个窍门,就让所有while循环的条件都用同一个变量,该变量的初始值为True,一旦在某一层将该变量的值改成False,则所有层的循环都结束
username = "jason" password = "123" count = 0 tag = True while tag: inp_name = input("请输入用户名:") inp_pwd = input("请输入密码:") if inp_name == username and inp_pwd == password: print("登陆成功") while tag: cmd = input('>>: ') if cmd == 'quit': tag = False # tag变为False, 所有while循环的条件都变为False break print('run <%s>' % cmd) break # 用于结束本层循环,即第一层循环 else: print("输入的用户名或密码错误!") count += 1
while+continue的使用
break代表结束本层循环,而continue则用于结束本次循环,直接进入下一次循环
while+else的使用
在while循环的后面,我们可以跟else语句,当while 循环正常执行完并且中间没有被break 中止的话,就会执行else后面的语句,所以我们可以用else来验证,循环是否正常结束
ount = 0 while count <= 5 : count += 1 print("Loop",count) else: print("循环正常执行完啦") print("-----out of while loop ------") 输出 Loop 1 Loop 2 Loop 3 Loop 4 Loop 5 Loop 6 循环正常执行完啦 #没有被break打断,所以执行了该行代码
2、for循环语法
for循环可以做的事情while循环都可以实现,之后以用for循环是因为在循环取值(即遍历值)时for循环比while循环更为简洁
语法:
for 变量名 in 可迭代对象:
代码一
代码二
for循环嵌套 #请用for循环嵌套的方式打印如下图形: ***** ***** ***** for i in range(3): for j in range(5): print("*",end='') print() # print()表示换行
for count in range(6): # range(6)会产生从0-5这6个数 print(count)