一
一、什么是编程语言
人与计算机沟通的语言
如何理解编程语言中各种语法存在的意义?
编程语言中出现的所有的语法都是为了控制计算机能够像人一样去做xxx
例如:
为何要有变量这种语法???
为了控制计算机能够像人一样去做xxx
二、什么是编程
编程是人把自己想命令计算机做的事用编程语言翻译出来并写到文件里
三、什么是程序
程序就是代码文件
程序又称为软件,软件是计算机硬件的灵魂
计算机硬件是负责做事的,具体怎么做则是由程序控制
四、编程的目的
让计算机像人一样帮我们做事,从而把人力解放出来
五、计算机硬件组成
五大组成部分
-
控制器:负责控制所有其他硬件的运行-----------》人的大脑
-
运算器:负责数学运算和逻辑运算---------------》人的大脑
控制器+运算器==》cpu-----------------------------》人的大脑 -
存储器:存取数据
-
内存/主存:--------------------------------------------》人脑的记忆功能
存放的是电信号,断电数据则丢失,只能临时保存数据,读写速度快 -
外存:---------------------------------------------------》本子
存放的是磁信号,断电数据仍存在,可以永久保存数据,读写速度慢 -
输入设备input
-
输出设备output
三大核心硬件
cpu
内存
硬盘
程序的运行经历两个阶段
- 加载阶段
程序先放到硬盘当中
程序的运行需要把程序的代码从硬盘加载到内存中 - 运行阶段
cpu从内存中提取代码执行
六、计算机体系三层结构
七、计算机完整体系结构图
图形化界面应用程序
命令
cmd.exe bash python.exe 图形桌面
系统接口层
内核
(操控系统)
计算机硬件
一个非常重要的基础概念:平台
应用程序都是运行于操作系统之上,而操作系统则是运行于硬件之上的,所以承载应用程序的是一台运行有操作系统的计算机,称之为应用程序的运行平台,即:硬件 + 操作系统 == 平台
二
一、编程语言分类
机器语言:直接使用二进制指令编写程序
优点:执行效率高
缺点:
1、二进制指令非常难记,容易出错
2、即便是要实现一个小功能,需要用到的二进制指令的条数也非常多
汇编语言:用英文标签取代二进制指令去编写程序
高级语言:用人类能理解的表达方式去编写程序,意味着计算机无法直接理解,必须经过翻译
编译型(go、c)
解释型(python、shell)
总结
- 执行效率:机器语言>汇编语言>高级语言(编译型>解释型)
- 开发效率:机器语言<汇编语言<高级语言(编译型<解释型)
- 跨平台性:解释型具有极强的跨平台型
python的三大特点:
- 语法极简
- 第三方库丰富
- 封装程度高
二、编写python程序
交互式环境:辅助调试
每敲一行代码会立即得到代码的运行结果
写入文件:主流
python3 “D:\1.txt”
三、IDE
IDE全称Integrated Development Environment,即集成开发环境,最好的开发Python程序的IDE就是PyCharm。
四、运行python程序的三个阶段
例:python3 “D:\1.py”
1、先启动python解释器
2、解释器会1.py的内容从硬盘读入内存
3、解释器会解释执行刚刚读入内存的内容,开始识别python语法
三
一、注释
1、单行注释用#号,可以跟在代码的正上方或者正后方
2、多行注释可以用三对双引号""" “”"或三对单引号
二、变量
1、什么是变量
量指的是事物的状态
变指的是事物的状态是可以改变
变量就是一种存取内存的机制
2、为何要用变量
为了控制计算机能够像人一样记住事物的状态
并且状态是可以改变的
3、如何用变量
原则:先定义,后引用
定义:
变量名 = 变量值
引用:
变量名
三、变量的基本使用:先定义、后引用
四、变量的三大组成部分
name = "egon"
(1) 变量名:指向变量值的内存地址,用来访问值的
(2)赋值符号:用来把值的内存地址绑定给变量名
(3)变量值:记录的事物的状态,也就是我们存到内存中的数据
五、变量名详解
1、左值与右值
x = 18
变量名出现在等号左边,称之为左值,此时的变量名是一种存值行为
print(x)
只要不在等号左边,就称之为右值,此时的变量名是一种取值行为
2、变量名的命名
- 大前提:见名知意
- 规范
(1)变量名只能是字母、数字或下划线的任意组合
(2)变量名的第一个字符不能是数字
(3)关键字不能声明为变量名[‘and’, ‘as’, ‘assert’, ‘break’, ‘class’, ‘continue’, ‘def’, ‘del’, ‘elif’, ‘else’, ‘except’, ‘exec’, ‘finally’, ‘for’, ‘from’, ‘global’, ‘if’, ‘import’, ‘in’, ‘is’, ‘lambda’, ‘not’, ‘or’, ‘pass’, ‘print’, ‘raise’, ‘return’, ‘try’, ‘while’, ‘with’, ‘yield’] - 命令风格
(1)驼峰体
AgeOfEgon = 18
(2)纯小写+下划线 (推荐)
age_of_egon = 18
3、 变量值
两大特征:id、type
六、内存管理机制之垃圾回收机制GC
-
引用计数
x = 10 # 10引用计数为1
y = x # 10引用计数为2
x = 20 # 10的引用计数为1
del y # 10的引用计数为0 -
分代回收
原理:在历经多次扫描的情况下,都没有被回收的变量,gc机制就会认为,该变量是常用变量,gc对其扫描的频率会降低
优点:降低扫描数数量,提升效率
缺点: 有个别数据无法得到及时的处理 -
标记/清除算法的核心:
如果一个值没有关联任何一条以直接引用作为出发点的引用,那么该值就会被标记下来,并且清除
如果一个变量值不存在任何以栈区为出发点的引用,那么标记/清除算法就认为它是垃圾
循环引用导致的内存泄漏问题------》标记/清除
七、内存管理机制之小整数池
Python实现int的时候有个小整数池。为了避免因创建相同的值而重复申请内存空间所带来的效率问题, Python解释器会在启动时创建出小整数池,范围是[-5,256],该范围内的小整数对象是全局解释器范围内被重复使用,永远不会被GC回收
八、常量
常量即指不变的量,如pai 3.141592653…, 或在程序运行过程中不会改变的量
九、基本数据类型
1、整型int
作用:年龄、等级、各种号码
2、浮点型float
作用:记录薪资、身高、体重等
3、字符串str
作用:记录名字、字符相关的描述性的内容
4、列表类型list
作用:按照位置存放多个值,可以用索引取指定位置的值
- 列表类型就是专门用来记录多个同种属性的值(比如同一个班级多个学生的姓名、同一个人的多个爱好等)
5、字典类型dict
作用:按照key:value的形式存放多个值,其中value可以是任意类型,而key通常是str类型
- 需要用一个变量记录多个值,但多个值是不同属性的,比如人的姓名、年龄、身高
6、布尔类型bool
作用:用来记录真假这两种状态
(1)显式的布尔值: True,False
(2)隐式的布尔值: 0、None、空的布尔值为False,其余均为真
重点
1. 可变类型:在id不变的情况下,value可以变,则称为可变类型,如列表,字典
2. 不可变类型:value一旦改变,id也改变,则称为不可变类型(id变,意味着创建了新的内存空间)
十、基本运算符
1、算术运算符
2、比较运算符
3、赋值运算
3.1 增量赋值
age += 3 # age = age + 3
age /= 3 # age = age / 3
3.2 链式赋值
x=10
y=x
z=y
x=y=z=10
3.2 交叉赋值
m = 100
n = 200
temp=m
m=n
n=temp
m,n=n,m
3.4 解压赋值
salaries = [1.1,2.2,3.3,4.4,5.5]
mon0 = salaries[0]
mon1 = salaries[1]
mon2 = salaries[2]
mon3 = salaries[3]
mon4 = salaries[4]
mon0,mon1,mon2,mon3,mon4=salaries
print(mon0,mon1,mon2,mon3,mon4)
#1.1 2.2 3.3 4.4 5.5
mon0,mon1,*_=salaries
print(mon0)
#1.1
print(mon1)
#2.2
print(_)
#[3.3,4.4,5.5]
4、逻辑运算
(1)三者的优先级关系:not>and>or,同一优先级默认从左往右计算。
(2)最好使用括号来区别优先级
(3)短路运算:逻辑运算的结果一旦可以确定,那么就以当前处计算到的值作为最终结果返回
5、身份运算
需要强调的是:==双等号比较的是value是否相等,而is比较的是id是否相等
6、成员运算符
十一、格式化输出
程序中经常会有这样场景:要求用户输入信息,然后打印成固定的格式
比如要求用户输入用户名和年龄,然后打印如下格式:
My name is xxx,my age is xxx.
很明显,用逗号进行字符串拼接,只能把用户输入的名字和年龄放到末尾,无法放到指定的xxx位置,而且数字也必须经过str(数字)的转换才能与字符串进行拼接。
这就用到了占位符,如:%s、%d
#%s字符串占位符:可以接收字符串,也可接收数字
print('My name is %s,my age is %s' %('egon',18))
#%d数字占位符:只能接收数字
print('My name is %s,my age is %d' %('egon',18))
print('My name is %s,my age is %d' %('egon','18')) #报错
#接收用户输入,打印成指定格式
name=input('your name: ')
age=input('your age: ') #用户输入18,会存成字符串18,无法传给%d
print('My name is %s,my age is %s' %(name,age))
#注意:
#print('My name is %s,my age is %d' %(name,age)) #age为字符串类型,无法传给%d,所以会报错
四
一、用户与程序交互
古时候,我们去银行取钱,需要有一个银行业务员等着我们把自己的账号密码输入给他,然后他去进行验证,成功后,我们再将取款金额输入/告诉他
骄傲的现代人,会为客户提供一台ATM机(就是一台计算机),让ATM机跟用户交互,从而取代人力。然而机器是死的,我们必须为其编写程序来运行,这就要求我们的编程语言中能够有一种能与用户交互,接收用户输入数据的机制
#在python3中
input:用户输入任何值,都存成字符串类型
#在python2中
input:用户输入什么类型,就存成什么类型
raw_input:等于python3的input
input(“请输入:”)
print(‘xxx’,end="\n")
二、流程控制之if…else
- 单分支
print('start...')
inp_name = input("请输入您的用户名:")
if inp_name == "egon":
print('ok')
print('end...')
- 双分支
print('start...')
inp_name = input("请输入您的用户名:")
if inp_name == "egon":
print('ok')
else:
print('error')
print('end...')
- 多分支
# 如果:成绩>=90,那么:优秀
# 如果成绩>=80且<90,那么:良好
# 如果成绩>=70且<80,那么:普通
# 其他情况:很差
score = input("your score: ")
score = int(score)
if score >= 90:
print("优秀")
if 10 > 3:
print('ok')
elif score >= 80 and score < 90:
print("良好")
elif score >= 70 and score < 80:
print("普通")
else:
print('很差')
- 优化版
score = input("your score: ")
score = int(score)
if score >= 90:
print("优秀")
elif score >= 80:
print("良好")
elif score >= 70:
print("普通")
else:
print('很差')
- 完整语法
if 条件1:
代码1
代码2
代码3
...
elif 条件2:
代码1
代码2
代码3
...
elif 条件3:
代码1
代码2
代码3
...
......
else:
代码1
代码2
代码3
"""
请输入您的用户名
请输入您的密码
判断 输入的用户名 等于 正确的用户名 并且 输入的密码 等于 正确的密码:
告诉用户登录成功
否则:
告诉用户账号密码错误
"""
inp_name = input("username: ")
inp_pwd = input("password: ")
if inp_name == "egon" and inp_pwd == "123":
print("登录成功")
else:
print("账号密码错误")
三、流程控制之while循环
1、 基本使用
语法
while 条件:
代码1
代码2
代码3
i=0
while i < 5: # 5 < 5
print(i) # 4
i += 1 # i=5
"""
0
1
2
3
4
"""
2、死循环:永远也不结束的循环
while True:
1+1
3、结束while循环的两种方式
(1) break:直接终止本层循环,不会有下一次循环
tag = True
while tag:
print('start...')
break
print('end...')
(2) 条件改为假:不会直接终止本层循环,会在下一次循环时终止
tag = True
while tag:
print('start...')
tag = False
print('end...')
# 案例
tag = True
while tag:
inp_name = input("username: ")
inp_pwd = input("password: ")
if inp_name == "egon" and inp_pwd == "123":
print("登录成功")
# break
tag = False
else:
print("账号密码错误")
print('xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx')
print('end...')
#
while True:
while True:
while True:
break
break
break
#
tag = True
while tag:
while tag:
while tag:
tag=False
4、while+continue
continue:终止本次循环,直接进入下一次
i = 0
while i < 5:
if i == 3:
i+=1
continue
print(i)
i+=1 # i=3
# 案例
while True:
inp_name = input("username: ")
inp_pwd = input("password: ")
if inp_name == "egon" and inp_pwd == "123":
print("登录成功")
break
else:
print("账号密码错误")
# continue # 画蛇添足
print('end...')
5、while+else
i = 0
while i < 5:
if i == 3:
# i+=1
# continue
break
print(i)
i+=1
else:
print('xxxxxxxxxxxxxxxx')
五
一、流程控制之for循环
1、 基本使用
for 变量名 in 可迭代对象: # 此时只需知道可迭代对象可以是字符串\列表\字典,我们之后会专门讲解可迭代对象
代码一
代码二
...
#例1
for item in ['a','b','c']:
print(item)
# 运行结果
a
b
c
2、 for + break
for x in [111,222,33,444,555]:
if x == 33:
break
print(x)
3、 for + continue
for x in [111,222,33,444,555]:
if x == 33:
continue
print(x)
4、 for + else
for x in [111,222,33,444,555]:
if x == 33:
# break
continue
print(x)
else:
print('xxxxxxxxxxxxxxx')
5、 for+range
ll = [111,222,33,444,555]
for i in range(len(ll)):
print(ll[i])
6、 for+enumerate
ll = [111,222,33,444,555]
for i,v in enumerate(ll): # i,v=(0, 111)
print(i,v)
7、 for循环嵌套
for i in range(3): # i=2
print('=================>外层循环', i)
for j in range(5):
print("内层循环", j)
"""
=================>外层循环 0
内层循环 0
内层循环 1
内层循环 2
内层循环 3
内层循环 4
=================>外层循环 1
内层循环 0
内层循环 1
内层循环 2
内层循环 3
内层循环 4
=================>外层循环 2
内层循环 0
内层循环 1
内层循环 2
内层循环 3
内层循环 4
"""
二、可变不可变类型
可变类型:值改变了,id不变,证明就是在改变原值,原值是可变类型(例如列表,字典)
不可变类型:值改变了,id也跟着变,证明就是在产生了新的值,原值是不可变类型
三、基本数据类型及内置方法(一)
1、数字类型int与float
(1)整型int
# ======================================int基本使用=================================&