# 这门课程是我最强烈推荐的python入门课程之一。原因有三:其一,其更加关注编程的思想,极具有启发性;其二,”小“但系统,可扩展性强;其三,有配套线上练习和测试。
# 本文将每次更新一个章节,直到课程结束。
# 本文从5.28--6.7日,历时11天,基本更新完毕,后面还有两张不属于python基础,后续将以demo的方式进行详细讲解。
计算机是根据指令操作数据的设备 计算机发展参照摩尔定律,表现为指数形式
-
计算机执行源程序两种方式:编译和解释
-
编译:将源代码一次性转换成目标代码的过程。执行编译过程的程序叫编译器
(compiler)。
-
解释:将原代码逐条转换成目标代码同时逐条运行的过程。执行解释过程的程序叫解释器
(interpreter)。
-
静态语言:使用编译执行的编程语言
(C/C++,java)
-
脚本语言:使用解释执行的编程语言
(Python,JavaScript,PHP)
-
IPO:
-
input输入:文件输入、控制台输入、交互输入、内部参数输入等。
-
process处理(主要逻辑):算法(灵魂)
-
output输出:控制台、文件、网络、操作系统内部变量等输出。
编程体现一种抽象交互、自动化执行的思维方式 计算思维:区分逻辑思维和实证思维的第三种思维模式。
略
题目本身简单,但学会这种思维,其他常见的"转换"问题解决方法同理。
-
python中用
"缩进"表达程序的语法框架,表达代码间包含关系的唯一手段
-
注释:用于提高代码可读性的辅助文字,不被执行。
-
变量:用来保存和表示数据的占位符号,变量采用标识符(名字)来表示。
-
命名:数字字母下划线。
-
"注意":大小写敏感,数字不能放开头,不与保留字同。
-
python中共有
33个保留字,查询方法:
-
``
`
-
import
keyword
-
print(keyword.kwlist)
-
`
``
-
字符串:由
0个或多个字符组成的
"有序"字符序列。
# 有序-->可以索引、切片
-
整数:数学中的整数
-
浮点数:数学中的实数,带有小数点部分
-
列表:由
0个或多个数据组成的
"有序"序列
赋值语句 分支语句 函数
-
input()控制台输入
-
print()控制台输出,格式化
-
注:这两兄弟,在控制台显示的时候,一个添加引号形成字符串,一个将字符串自动去掉引号。
-
补充:
"eval()"去掉参数最外侧引号并执行余下语句的函数
略
-
1946
-1981:计算机系统结构时代(
35年):
-
1981
-2008:网络和视窗时代(
27年)
-
2008
-2016:复杂信息系统时代(
8年)
-
2016- :人工智能时代
-
-
计算能力问题
-->交互问题-->数据问题-->人类的问题
-
C: 性能
-
Java:跨平台
-
C++: 大规模程序
-
VB: 桌面应用
-
Python:计算时代演进的选择
通用语言 脚本语言 开源、跨平台、多模型语言
-
C/
C++:python归python ,
c归
c
-
Java:针对特定开发和岗位需求
-
HTML
/CSS/
JS:不可替代的前端技术,全栈能力
-
其他语言:
R
/Go/
Matlab等,特定领域
工具决定思维:关注工具变革的力量!
-
机器语言
--> 代码直接执行,与CPU有关
-
汇编语言
--> 助记符,汇编器,与CPU有关
-
高级语言
--> 编译器,与CPU无关
-
超级语言
--> 整合已有程序,庞大计算生态
== python是唯一的超级语言! ==
== import turtle == 导入海归绘图库
-
Python蟒蛇绘制问题是各类图形绘制问题的代表
-
--圆形绘制、五角星绘制、国旗绘制、机器猫绘制...
-
-
-注:turtle库是turtle绘图体系的python实现
-
-
-1969年诞生,是python标准库之一,入门级图形绘制函数库
-
-
-Python计算生态 = 标准库 + 第三方库
-
-
库Library、包Package、模快Module,统称模块
-
turltle
.
setup(
width,
height,
startx,
starty)
-
--注:
4个参数后两个可选,不选则默认在窗口的正中间,
setup()不是必须的
-
-
-1)绝对坐标:和数学中的坐标系(象限)知识相同
-
-
-turtle.goto(x,y)
-
-
-
-2)海龟坐标:后退<-->前进;左侧<-->右侧
-
-
-
-3)空间坐标体系:turtle.bk(d),turtle.fd(d),burtle.circle(r,angle)
-
-
-1)绝对角度:0/360,90/-270,180/-180,270/-90
-
-
-turtle.seth(angle):改变海龟行进方向,angle为绝对度数,只改变方向不前进。
-
-
-
-2)海龟角度:turtle.left(angle),turtle.right(angle)
-
-
-RGB指 红 蓝 绿 组合
-
-
-RGB整数值,小数值
-
-
-turtle.colormode(mode),默认小数值
-
import turtle
-
turtle. 格式:
<a>.
<b>()
-
<库名>.
<函数名>(
<函数参数>)
-
或
<库别名>.
<函数名>(
<函数参数>)
-
penup(),
pendown(),
pensize(),
pencolor()
-
别名:
pu(),
pd()
-
pensize(width)
--> 别名:
width(width)
-
pencolor(color) 颜色字符串、
rgb值(三个小数值,或 一个元组小数值)
-
fd(),circle(r,extent=None)
-
-
-r:默认圆心在海龟左侧r距离的位置
-
-
-extent:绘制角度,默认是360度整圆
-
turtle
.setheading(
angle) 别名:
seth(
angle)
-
turtle
.left(),
turtle
.right()
-
-
-3.1.1整数类型:与数学中概念一致,+|-均可,无范围限制
-
-
-pow(x,y)函数
-
-
-3.1.2 4种进制表示形式:
-
十进制,二进制(0b,0B开头),八进制(0o,0O开头),十六进制(0x,0X)
-
-
-
-3.1.3浮点数类型:浮点数范围和小数精度都存在限制,但常规计算可以忽略
-
浮点数间运算存在不确定尾数,发生在10E-16左右,不是bug
-
-
- round(x,d):对x四舍五入,d是小数截取位数。用于浮点数间运算及比较。
-
-
- 浮点数采用科学计数法表示e
-
-
-
-3.1.4复数类型:Z.real获得实部,Z.imag获得虚部
-
-
-
-3.1.5数值运算操作符:类型间可以混合运算,生成结果为“最宽”类型。
-
-
-
-数值运算函数:
-
-
- abs(x) 绝对值
-
-
- divmod(x,y) => 同时输出商和余数
-
-
- pow(x,y[,z]) => 幂余,(x**y)%z
-
-
- round(x[,d]) => 四舍五入,d小数位数,默认为0
-
-
- max()最大值
-
-
- min()最小值
-
-
- int(x)
-
-
- float()
-
-
- complex(x)
-
略
-
-
-
GRIT,坚毅,对长期目标的持续激情及持久耐力
-
-
GRIT是获得成功最重要的因素之一,牢记天天向上的力量
-
-
- 单引号,双引号;三引号
-
-
- 索引 [M]
-
-
- 切片 [M,N,K]
-
-
- 转义字符:\b回退,\n换行,\r回车(光标移到本行行首)
-
-
- + 字符串拼接
-
-
- * 复制n次字符串
-
-
- in
-
-
- len(x)
-
-
- str(x) 任意类型所对应的字符串形式
-
-
- hex(x)或oct(x) 整数x的十六进制或八进制小写形式字符串
-
-
- chr(u) u为Unicode编码,返回其对应的字符
-
-
- ord(x) x为字符,返回其对应的Unicode编码
-
-
- S.lower()或S.upper() 返回字符串副本,全部字符小写/大写
-
-
- S.split(sep=None) 返回一个列表,由str根据sep被分隔部分组成
-
-
- S.count(sub) 返回子字符串sub在str中出现的次数
-
-
- S.replace(old,new)
-
-
- S.center(width[,fillchar])
-
-
- S.strip(chars)从str中去掉在其左侧和右侧chars中列出的字符。
-
-
- S.join(iter) 在iter变量除最后元素外每个元素增加一个S。例如:','.join("12345") #主要用于字符串分割
-
"{
<参数序号>:
<格式控制标记>}"
-
-
:
<填充>
<对齐>
<宽度>
<,>
<.精度>
<类型>
-
时间获取:
time()
ctime()
gmtime()
-
时间格式化:
strftime()
strptime()
-
程序计时:
sleep(),
perf_counter()
-
.time() 获取当前时间戳,即计算计算机内部时间值,浮点数。
-
-
.ctime()获取当前时间并以易读方式表示,返回字符串
-
-
.gmtime()获取当前时间,表示为计算机可处理的时间格式
-
.strftime(tpl,ts) : tpl是格式化模板字符串,用来定义输出效果,ts是计算机内部时间类型变量
-
t = time.gmtime()
-
time.strftime(
"%Y-%m-%d %H:%M:%S", t)
-
-
-
t = time.gmtime()
-
time.strftime(
"%Y-%m-%d %H:%M:%S", t)
-
-
timeStr =
"2018-01-26 12:55:20"
-
time.strptime(timeStr,
"%Y-%m-%d %H:%M:%S")
-
start =
time.perf_counter()
-
end =
time.perf_counter()
-
end -
start
-
-
sleep(s) s拟休眠时间,单位是秒,可以是浮点数
-
这里理解一个重要的系统概念:刷新
-
本质:用后打印的字符串覆盖之前的字符串。不能换行(
end=),要能回退\r
-
# TextProBarV3.py
-
import time
-
scale =
50
-
print(
"执行开始")
-
start = time.perf_counter()
-
for i
in range(scale +
1):
-
a =
"*" * i
-
b =
"." * (scale - i)
-
c = (i / scale) *
100
-
dur = time.perf_counter() - start
-
print(
"\r{:^3.0f}%[{}->{}]{:.2f}s".format(
c, a, b, dur), end=
"")
-
time.sleep(
0.1)
-
print(
"\n" +
"执行结束".center(scale
//
2
,
"-"
))
“程序的控制结构”:顺序结构、分支结构、循环结构
-
语法:
if
<条件>:
-
<语句块>
-
语法:
if
<条件>:
-
<语句块1>
-
else:
-
<语句块2>
-
-
紧凑形式:适用于简单表达式的二分支结构
-
<表达式1>
if
<条件>
else
<表达式2>
-
语法:
if
<条件1>:
-
<语句块1>
-
elif
<条件2>
:
-
<语句2>
-
...
-
else:
-
<语句块N>
注: 注意多条件之间的包含关系,注意变量取值范围的覆盖。 通俗点: 多分支结构中,如果一个分支判断条件通过后,会执行对应的语句块,之后结束分支程序。即使,后续的elif条件也满足,也不会执行对应的语句块.所以这里其实也有一个顺序关系。
-
-
-条件判断操作符:<,<=,>=,>,==,!=
-
-
-
-条件组合三个保留字:and,or,not
-
try:
-
<语句块
1
>
-
except
[<异常类型>]
:
-
<语句块
2
>
-
注:标注异常类型后,仅响应该异常,异常类型名字等同于变量。
-
高级使用:
-
-
try:
-
<语句块1>
-
except:
-
<语句块2>
-
else:
# 不发生异常的时候执行(奖励)
-
<语句块3>
-
finally:
# 一定会执行
-
<语句块4>
-
BMI = 体重
(Kg)/身高^
2
(m^2)
-
略
注:阅读代码的时候,快速的方法是:先搞懂分支的范围关系,再深入看每个分支在做什么。而不是从上到下的顺序结构。
###4.3.1 遍历循环
-
for <循环变量>
in <遍历结构>:
-
<语句块>
-
-
-从遍历结构中逐一提取元素,放在循环变量中。
-
-
-完整遍历所有元素后结束
-
-
-每次循环,所获得元素放入循环变量,并执行一次语句块
-
-
应用:计数循环、字符串遍历循环、列表遍历循环、文件遍历循环、等等
-
while
<条件>:
-
<语句块>
-
-
break 跳出并结束当前循环,执行循环后的语句
-
-
-
continue 结束当次循环,继续执行后续次数循环
-
-
--
break和
continue可以与
for和
while循环搭配使用。
-
循环中增加
else:
-
<语句块
2>
-
-
-
-当循环没有被break语句退出时,执行else语句块
-
-
-else语句块作为“正常”完成循环的奖励
-
-
-这里else的用法与异常处理中else用法相似
-
-
-伪随机数:采用梅森旋转算法生成的(伪)随机序列中元素
-
-
-random库主要用于生成随机数
-
seed(a=None)
--初始化给定的随机数种子,默认为当前系统时间
-
-
-random.seed(10) # 产生种子10对应的序列
-
-
-这个在实战中用的比较多,“确定”的伪随机数便于对程序进行复现。
-
-
random()
-
-
-生成一个[0.0,1.0)之间的随机小数
-
-
-random.random()
-
>
1. randint(a,b) 生成[a,b]之间的整数
-
-
>
2. randrange(m,n[,k]) 生成一个[m,n)之间以k为步长的随机整数
-
-
>
3. getrandbits(k) 生成一个k比特长的随机整数
-
-
>
4. uniform(a,b) 生成一个[a,b]之间的随机小数
-
-
>
5. choice(seq) 从序列seq中随机选择一个元素
-
-
>
6. shuffle(seq) 将序列seq中元素随机排列,返回打乱后的序列
-
from random
import random
-
from time
import perf_counter
-
DARTS =
1000 *
1000
-
hits =
0.0
-
start = perf_counter()
-
for i
in range(
1, DARTS+
1):
-
x, y = random(), random()
-
dist = pow(x **
2 + y **
2,
0.5)
-
if dist <=
1.0:
-
hits +=
1
-
pi =
4 * (hits / DARTS)
-
print(
"圆周率是:{}".format(pi))
-
print(
"运行时间是:{:.5f}s".format(perf_counter() - start))
-
函数是一段具有特定功能、可重用的语句组
-
降低编程难度 和 代码复用
-
-
def
<函数名>(
<参数(0个或多个)>):
-
<函数体>
-
return
<返回值>
-
-
不调用不会被执行
-
调用是运行函数代码的方式
-
-
调用时给出实际参数,替代定义中的形式参数
-
-
函数调用得到返回值
-
-
- 参数的个数:0,1,或多个。但是必须保留括号
-
-
-
- 可变数量参数,既不确定参数总数量
-
-
-
- 传递参数两种方式:位置参数,名称传递
-
-
- return 保留字用来传递返回值
-
-
- 可以传,可以不传,可以传递0个,也可以传多个
-
-
- (一般函数外部是全局变量,函数内部的变量是局部变量)
-
-
规则一:局部变量和全局变量是不同变量
-
-
-局部变量是函数内部的占位符,与全局变量可能重名但不同
-
-
-函数运算结束后,局部变量被释放
-
-
-可以用 global保留字在函数内部使用全局变量
-
(这里还分可变类型和不可变类型)
-
-
规则二:局部变量为组合数据类型且未创建,等同于全局变量
-
-
使用规则:
-
-
基本数据类型,无论是否重名,局部变量与全局变量不同
-
-
可以通过global保留字在函数内部声明全局变量
-
-
组合数据类型,如果局部变量未真实创建,则是全局变量
-
无名,保留字,函数名是返回结果
-
-
<函数名> = lambda <参数>:<表达式>
-
-
-
-主要作用 特定函数或方法 的参数
-
-
- 固定使用方式,逐步积累掌握
-
-
- 一般情况,用def定义普通函数,慎用lambda
-
-
-1. 绘制单个数字对应的数码管
-
-
-2. 获得一串数字,绘制对应的数码管
-
-
-3. 获得当前系统时间,绘制对应的数码管
分析单个数码管:
获取一段数字,绘制多个数码管:
获取当前系统时间:
PS:分形几何,自然界常见
6.2.1 定义
6.2.2 函数和方法
6.2.3 元组类型及操作
6.2.4 列表类型及操作
6.2.5 序列类型应用场景
6.4.1 定义
函数和方法
应用场景
略
7.1.1 文件的类型
7.1.2 文件打开和关闭
读文件:3种方法 VS 写文件: 3种方法 -文件的打开: <变量名> = open(<文件名>,<打开模式>)
变量名:文件句柄
文件名:文件路径和名称(源文件同目录可省略)
打开模式:文本or二进制;读or写
补充:windows下,文件目录之间用\,这个和python冲突,解决方式两种:\\,或者用/ .
打开模式:
文件打开模式 | 描述 |
---|---|
"r" | 只读模式,默认值,若文件不存在,返回FileNotFoundError |
"w" | 覆盖写模式,文件不存在则创建,存在则完全覆盖 |
"x" | 创建写模式,文件不存在则创建,存在则返回FileExistsError |
"a" | 追加写模式,文件不存在则创建,存在则在文件最后追加内容 |
"b" | 二进制文件模式 |
"t" | 文本文件模式,默认值 |
"+" | 与r/w/x/a一同使用,在原功能基础上增加同时读写功能 |
文件关闭:变量名.close()
7.1.3 文件内容的读取
操作方法 | 描述 |
---|---|
读入全部内容,如果给出参数,读入前size长度 | |
读入一行内容,如果给出参数,读入该行前size长度,每读取一行指针移动到下一行的行首。 | |
读入文件所有行,以每行为元素形成列表。如果给出参数,读入前hint行。 |
-
fo =
open(filename,
"r")
-
txt = fo.read(
2)
-
while txt !=
"":
-
# 对txt进行处理
-
txt = fo.read(
2)
-
fo.close()
-
fo =
open(filename,
"r")
-
for line
in fo.readlines():
-
print(line)
-
fo.close()
-
fo = open(filename,
"r")
-
for line
in fo:
# 通过迭代器访问
-
print(line)
-
fo.close()
操作方法 | 描述 |
---|---|
向文件写入一个字符串或字节流 | |
将一个元素全为字符串的列表写入文件 | |
改变当前文件操作指针的位置,offset含义如下:0 - 文件开头;1 - 当前位置;2 - 文件结尾 |
-
fo = open(
"output.txt",
"w+")
-
ls = [
"中国",
"法国",
"美国"]
-
fo.writelines(ls)
-
fo.seek(
0)
# 否则,没有结果输出
-
for line
in fo:
-
print(line)
-
fo.close()
7.2.1 问题分析
7.2.2 实例讲解
7.2.3 举一反三
7.3 一维数据的格式化和处理
7.3.1 数据组织的维度:组织形式
一维数据的表示
一维数据的存储
一维数据的处理
7.4 二维数据的格式化和处理
-
fo = open(filename)
-
ls = []
-
for line
in fo:
-
line = line.
replace(
"\n",
"")
-
ls.append(line.
split(
","))
-
fo.close()
-
ls = [[], [], []]
# 二维列表
-
f =
open(fname,
"w")
-
for item
in ls:
-
f.write(
",".
join(item) +
"\n")
-
f.close()
-
ls = [[], [], []]
#二维列表
-
for row
in ls:
-
for cloumn
in row:
-
print(ls[row][column])
8.1 实例13:体育竞技分析
8.2 Python程序设计思维
8.3 Python第三方库安装
8.4 模快7:os库的基本使用
os库是标准库,包含几百个函数,常用路径操作、进程管理、环境参数等几类
8.4.1 路径操作:os.path子库,处理文件路径及信息
函数 | 描述 |
---|---|
os.path.abspath(path) | 返回path在当前系统中的绝对路径 |
os.path.normpath(path) | 归一化,统一用\\分隔路径 |
os.path.relpath(path) | 返回相对路径 |
os.path.dirname(path) | 返回Path中目录名称 |
os.path.basename(path) | 返回path中最后的文件名称 |
os.path.join(path,*paths) | 组合path,返回路径字符串 |
os.path.exists(path) | 判断path对应文件目录是否存在,返回bool |
os.path.isfile(path) | 判断path所对应是否为已存在的文件,返回bool |
os.path.isdir(path) | 判断path所对应是否为已存在的文件,返回bool |
os.path.getatime(path) | 返回path对应文件或目录上一次的访问时间 |
os.path.getmtime(path) | 返回path对应文件或目录最近一次的修改时间 |
os.path.getctime(path) | 返回path对应文件或目录的创建时间 |
os.path.getsize(path) | 返回path对应文件的大小,以字节为单位 |
8.4.2 进程管理:启动系统中其他程序
8.4.3 环境参数:获得系统软硬件信息等环境参数
函数 | 描述 |
---|---|
os.chdir(path) | 修改当前程序操作的路径 |
os.getcwd() | 返回程序的当前路径 |
os.getlogin() | 获得当前系统登陆用户名 |
os.cpu_count() | 获得当前系统的CPU数量 |
os.urandom(n) | 获得n个字节长度的随机字符串,通常用于加解密运算 |
8.5 实例14:第三方库自动安装脚本