蒟蒻的python 学习笔记
前言
版权声明:
本文受CC BY-NC-SA 4.0知识产权协议保护(署名 — 非商业性使用 — 相同方式共享)
除此以外,将本文任何内容用于其他用途时,须征得本文作者许可。
(可csdn私信)
笔记介绍:
学习记录,蒟蒻一枚的,预计2个月内更完。
作者特点:
1.喜欢研究语法问题,可能有各种奇怪的想法,有的地方会尝试地很透彻(或者最后说我也不知道为什么qwq,向大神求教)
2.真的蒟蒻非常非常非常蒟蒻,能从萌新的角度,说萌新容易懂的话。个人喜欢讲大白话啦~~~
3.作者很萌新,发现错误,请访问的您不吝赐教,帮忙指出,蟹蟹!
4.作者喜欢人,很外向,喜欢温暖,喜欢朋友~
加油冲冲冲,让我们一起努力,共同进步叭!!! ** ^ _ ^ **
课一:python语言程序设计
课程链接:link
第一周:python 基本语法元素
1.1 程序设计基本方法
- 和以前的c不一样,python 是脚本语言,使用解释器,逐条翻译
静态语言 | 脚本语言 | |
---|---|---|
翻译工具 | 编译器 ,先编译再运行 | 解释器,逐条翻译 |
举例 | C | python |
1.2 python 环境配置
测试代码:
print("hello")
r=25
area=3.1415*r*r
print(area)
print("{:.2f}".format(area))
import turtle
turtle.pensize(2)
turtle.circle(10)
turtle.circle(40)
turtle.circle(80)
turtle.circle(160)
from turtle import *
color('red','red')
begin_fill()
for i in range(5):
fd(200)
rt(144)
end_fill()
1.3 实例1:温度转换
'''hahaha'''
t=input("请输入带符号的温度")#注意用英文符号
#因为下面有格式错误,所以这里不print("转换后的温度是")
if t[-1] in ['f','F']:#如果最后一个(好像是)在这(f,F)之间
C=(eval(t[0:-1])-32)/1.8
#[0:-1]:除了最后一个以外eval:执行一个字符串表达式,并返回表达式的值。
print("转换后的温度是{:.2f}C".format(C))#这个C就是前面定义的变量C,格式化输出
elif t[-1] in ['c','C']:
F=1.8*eval(t[0:-1])+32
print("转换后的温度是{:.2f}F".format(F))
else:
print("格式错误")
1.用:分支
2.用elif不是else if
3.#用于注释
4.似乎直接处理字符串
1.4 python程序语法元素分析
-
缩进
python的缩进是严格明确的,表达层次关系。
(缩进多或少一条真的会运行不了)
程序内缩进长度一致。 -
注释
单行注释:
#。。。。。
多行注释:
'''。。。。
。。。。。。。 。。
。。。。注意英文单引号'''
注释,自己写,便于人阅读(c里面编译时视为空白)
- 变量
表示的称为:标识符
命名:关联标识符的过程
命名规则:
字母、数字、下划线、汉字等组成(比c广)
tip:区分大小写,不能数字开头,不能是保留字(如if,又叫关键字,防止冲突(c也是)) - 保留字
python自带的33个保留字,有固定的含义。
不能做变量名
(用IDLE的字体颜色可以区分,不用刻意记忆) - 数据类型
即数据的类型
用不同的数据形式,告诉计算机这是不同类型的数据
1.字符串
从0开始排序。
索引:不仅可以正向递增,0,1,2…
还可以反向递减,…-3,-2,-1
取法:不仅有t[0],t[-1]索引
还有t[0:-1]切片,
t[a:b]表示从a开始到b之前,a<=范围<b,a,b不需要同号,但是实际位置一定要a在b前(否则运行时越界)。
表示方法:字符串类型可以" "或’ ‘,没有区别,和c不一样(但是’ "不行)
2.数字类型
包括整数,浮点数
3.列表
由若干数据组成的有序数列
表示方法:[ ]表示,中间 , 分隔
*使用 in 判断一个元素是否在列表中 - 语句
赋值语句就那样
分支语句中,
提醒一下if,elif,else 判断后的:不能省 - 函数
1.输入函数
<变量>= input(<提示字符串>)
2.输出函数
print(<输出字符串>)
*可以格式化如:{:.2f}对应.format( C ),把C转为.2f格式,两位有效小数,输出
{}是一个插槽,会把format里面的打进去
{}可以有格式,{:.2f}这样的(整数也会多了两个0)
注意:插槽要和format里提供的变量个数一样
*其中,变成‘ ’:分隔符sep,可以最后sep=’…‘改
最后\n:结束符end,可以最后end=’…‘改
(不必先sep后end)
3.评估函数
eval(<字符串>)
去引号,字符串变为语句,之后用python语句的方式执行
*纠错:unexpected indent :行首不能多空格
invalid syntax:错在一对的符号没有用好,除了缺了一个,"…"…"…“是不行的,要用”…’…’…"区分
1.5 练习与测验注意点
1.温度转换
- : 容易掉,if / elif / else 后的 : ,{:.2f}的:都掉了。。
- if / elif / else : 后可直接写话,不用换行也可以
2.数字形式转换
template = "零一二三四五六七八九"
s = input()
for c in s:
print(template[eval(c)], end="")
- python中循环,for c in s:
不用设后才用,直接可以凭空弄出一个c,意思是从头到尾充当每一个s中的字符 - print(… , end="~") 的意思是,每次输出的最后输出~
3.温度转换2
- t[1:],可以表示字符串除首字符外的所有字符。
t[a:],可以表示字符串a号之后(包括)的所有字符
t[:a],可以表示字符串a号之前的(不包括)的所有字符 - 这样的表达形式也是成立的
if t[0] == 'F':
- 错误记录:EOL while scanning string literal——字符串以 \ 结尾 或者字符串缺少引号
print("F{:.2f}".format(eval(t[1:])*1.8+32)")
(实际上是最后多打了个 " )
4.货币转换
- CurStr[:3] == “RMB” 也可以,python可以直接比较字符串
- {:.2f}这次又写错了,这次写成2.f了,报Format specifier missing precision
- 发现:不能两句话同一行只留空格
- 发现:十进制非0整数不能以0开头。否则出现错误:invalid token
5.Hello World的条件输出
- int(~)能把 ~转化为int 型
- for 语言不通,不会用。。。
6.M OP N
- input() (别掉了())只会在回车换行时停止,而不会在空格停止(和c不一样)这里一次即可
- python只是要求缩进 , 对于 1 + 1 这样的不要求靠在一起
除了{:.2f},别的都可以加空格
{:_.2f}这样加空格,输出前会多一个空格,且只能多一个空格
这个地方加数字无显示,加符号错误
其他地方加空格也错误
最开头加0,通过,无效果
.af表示保留a位有效数字
print ("{: .2f}" . format ( eval ( input ( ) ) ) )
第二周:python基本图形绘制
2.1 深入理解python语言
计算机语言 | 关注内容 |
---|---|
c | 指针,内存,数据类型 |
Java | 对象,跨平台,运行时 |
c++ | 对象,多态,继承 |
python | 编程逻辑,第三方库 |
*确实比c短多了,还有共享的计算生态
“人生苦短,我用python”
2.2 实例2:python 蟒蛇绘制
实例代码:
import turtle#海龟库
turtle.setup(650,350,200,200)
turtle.penup()
turtle.fd(-250)
turtle.pendown()
turtle.pensize(25)
turtle.pencolor("purple")
turtle.seth(-40)
for i in range(4):
turtle.circle(40,80)
turtle.circle(-40,80)
turtle.circle(40,80/2)
turtle.fd(40)
turtle.circle(16,180)
turtle.fd(40*2/3)
turtle.done()
*非常惊艳,在c的ACLLib图形绘制时,准备工作还那么麻烦,操作的也只是基本几何图形。而这里已经栩栩如生画出了蟒蛇!
2.3 模块1:turtle库的使用
1. 概述
- turtle库:是turtle绘图体系的python实现
- turtle绘图体系:1969年(就?)诞生了,主要用于程序设计入门
- python语言的标准库之一
*可以理解为真的有一个turtle在爬
2. 库
- 标准库:随解释器直接安装到操作系统的功能模块
- 第三方库:需要安装才能使用的功能模块
- 库,包,模块,统称模块
3 .turtle的绘图窗体
- 原点:左上角
- 单位:像素
(和acllib一样) - 安放窗口的函数:
turtle.setup(窗口长度,窗口宽度,与左侧距离,与上侧距离)
*这个数值都要合理,不然界面就会消失,在状态栏里看也是一片空白没有蟒蛇
如下图所示,可看出窗口的左上角是边框的左上角
可省略后两个定位的,省去的,则居中
也可不使用setup函数,控制窗口大小、位置时才用
*这个的意思不是随机大小,而是默认大小(一个正方形),当然,居中
4 . turtle的空间坐标体系
- 绝对坐标
介绍:以窗口中心为原点的,平面直角坐标系
相关函数:turtle.goto(x,y)
——无论turtle在哪里,都去到( x , y )处 - 海龟坐标
介绍:以海龟为原点,前后左右的坐标系
相关函数:
turtle.fd(d)
——向前走d
turtle.bk(d)
——向后走d
turtle.circle(r,angle)
——以海龟左侧的某一个点为圆心(半径r),走曲线(角度angle)
*r为负数则为右侧了哈哈哈
5. turtle角度坐标体系
- 绝对角度
介绍:如下表示各角度的数值,正为逆时针转动得出,负数为顺时针转动得出
相关函数:
turtle.seth(angle)
——改变海龟方向到以上的angle(但不行进) - 相对角度
turtle.left(angle)
——海龟向左侧转angle度
turtle.right(angle)
——海龟向右侧转angle度
6. RGB色彩体系
red,green,blue三通道
每色取值范围为0~255整数或0 ~ 1 小数,调色
相关函数:
turtle.colormode(mode)
——切换color的模式,
mode=1.0为小数模式,255为整数模式,默认为小数模式
举例:
turtle.colormode(255)
turtle.color(211,22,11)
如此用法
当然也可以用默认的
turtle.color("blue")
这里面是个字符串
发现:color()和pencolor()一模一样,运行没有区别
2.4 turtle程序语法元素分析
1. 库引用和import
- 库引用:扩充python功能的方式
*如同c的头文件 - 三种方法:
- import <库名>
+<库名>.<函数名>(<函数参数>)
——繁琐,不重名 - from <库名> import *——引用整个库/
from <库名> import <函数名>——引用一个函数
+<函数名>(<函数参数>)
——不繁琐,可能重名 - import <库名> as <库别名>
+<库别名>.<函数名>(<函数参数>)
——不繁琐,不重名,好
*三种情况不能混用,不然说如“turtle未知什么的”
2. turtle 画笔控制函数
画笔操作后一直有效(直到下一次修改),一般成对出现
1.turtle.penup()
别名:turtle.pu()
——抬起画笔,海龟在飞行
*别名相当于c的 #define penup pu ,只是替换名字而已
2. turtle.pendown()
别名:turtle.pd()
——落下画笔,海龟在爬行
3.turtle.pensize(width)
别名:turtle.width(width)
——画笔宽度,海龟的腰围
4. turtle.pencolor(color)
——画笔颜色,海龟在涂装
其中(color)有三种形式:
形式 | 实例 |
---|---|
颜色字符串,小写字母的 | (“purple”) |
RGB的小数值 | (0.63,0.13,0.94) |
RGB的元组值 | ((0.63,0.13,0.94)) |
——切换了colormode后也可以用0~255如此调色,不止小数才可以
3. turtle的运动控制函数
(讲过了,注意一点负数)
turtle.fd(d)
——向前走d,负为向后
turtle.circle(r,angle)
——以海龟左侧的(负为右)某一个点为圆心(半径r),走曲线(角度angle)
4. turtle的方向控制函数
(也讲过了,,,,,,)
turtle.setheading(angle)
别名:turtle.seth(angle)
——改变海龟方向到绝对角度的angle位置
turtle.left(angle)
——海龟向左侧转angle度
turtle.right(angle)
——海龟向右侧转angle度
注意方向控制函数都是不行进,运动控制函数才是。
并且一句一句执行下,也不可能让运动控制函数中途改变既定方向。(可以循环什么的)
5. 循环语句与range()函数
- 关于for i in range(N): (小心掉了 : )
相当于for i in [1,2,3,4]
for <变量> in range(<参数>):#变量会从 0 到 参数-1 共 参数 次
<被循环执行的语句>#这段缩进的代码将被循环执行
- 关于range()
用于产生循环计数序列
range(N)相当于[0,1,2,…,N-1]
range(M,N)相当于[M,M+1,M+2,…,N-1]
左包括右不包括
6. 分析绘制
多了一个
turtle.done()
——如果描写方法是文件式的,
绘制程序完成后不自动退出,而是手动关闭退出
能留住窗口
*如同system(“pause”)
2.5 由于往期课程没有公布练习,一段时间放题后再补全
默写的实例代码:
import turtle as t
t.setup(650,350,200,200)
t.pu()
t.fd(-250)
t.pensize(25)
t.pencolor("blue")
t.pd()
t.seth(-40)
for i in range(4):
t.circle(40,80)
t.circle(-40,80)
t.circle(40,80/2)
t.fd(40)
t.circle(15,180)
t.fd(30)
第三周:
3.1数字类型及操作
1. 整数类型
优点:可正可负,无范围限制
进制 | 前缀表示 |
---|---|
十进制 | 无前缀 |
二进制 | 0b,0B |
八进制 | 0o,0O |
十六进制 | 0x,0X |
2. 浮点数类型
- 取值范围:-10e308 ~ 10e308
- 精度数量级:10e(-16)
注意:存在不确定位数(因为二进制存储与十进制实际值的差别) - 解决不确定位数的round函数:比较时,保留小数点后若干位四舍五入
如:
(也说明判断句的输出是True和False)
>>> round(0.1+0.2,2)==0.3
True
>>> 0.1+0.2==0.3
False
- 科学计数法x*10y写为 xey ,属于浮点数,注意y只能是整数
3. 复数类型
- 只有py有复数类型
- 表示:a+bj (J也可以)或者 complex(a,b),效果一样
注意:b必须要有,为1也不能省 - 对于复数z:
实部:z.real
虚部:z.imag
4. 数值运算操作符
操作符及使用 | 描述 |
---|---|
x+y | 加 |
x-y | 减 |
x*y | 乘 |
x/y | 除(小数结果) |
x//y | 除(结果取整数丢小数) |
+x | x本身 |
-y | y的负值 |
x%y | 取余 |
x**y | x^y |
x+=y | x=x+y |
x-=y | x=x-y |
x*=y | x=x*y |
x/=y | x=x/y |
x//=y | x=x//y |
x%=y | x=x%y |
x**=y | x=x^y |
- 类型之间可混合运算,生成结果是最“宽”类型:
整数 -> 浮点数 -> 复数
(.0也算小数)
5. 数值运算函数
函数及使用 | 描述 |
---|---|
abs(x) | x的绝对值 |
divmod(x,y) | 商余:输出 ( x//y , x%y ) |
pow(x,y[,z]) | 幂余:没有z,不取余,x** y;有z,结果对z取余,(x**y)%z |
round(x[,d]) | x的约等于(四舍五入),d为保留d位小数(可负,-1为保留至10位)(结果无法增加原本小数位数),默认保留整数即d=0 |
max(x1,x2,…,xn) | 最大值,这n个数中的(至少2个,不可比较复数,下同) |
min(x1,x2,…,xn) | 最小值,这n个数中的 |
int(x) | 若x为字符串,要求eval(x)为整数(否则错),先进行eval()再操作;若x为小数,转换为整数;若x为整数,保留原样 |
float(x) | 若x为字符串,先进行eval()再操作;若x为整数,转换为小数;若x为小数,保留原样 |
complex(x[,y]) | 没y:将x变为复数,增加虚数部分,为x+0j;有y:表示x+yj |
- […]表示其中参数可省略
3.2 实例3:天天向上的力量
第一次用函数
def Day(df):#定义函数的方法,注意:
#注意缩进一格
s=1
for i in range(365):
if i%7 in [6,0]:
s*=0.99
else:
s*=(1+df)
return s#返回值
df =0.01#无需main()这样的。注意初始值不能太大了
while Day(df)<37.78:#while的使用
df+=0.001
#print("{:3f}".format(df))(调试用)
print("{:3f}".format(df))
同时这个问题非常有哲理启发:
GRIT,坚毅,对长期目标的持续激情及持久耐力
GRIT,是获得成功的最重要的因素之一,牢记天天向上的力量
3.3 字符串类型及操作
暂时搞acm,先记录老师的笔记
关于if else
- 紧凑:a=(若对了)if(判断)else(若错了)
- pass:
等于跳过,有一点像continue,但是continue只用于循环,pass用于分支结构。
c语言没有pass,continue也不能用于分支,python有continue。
python中什么都不干必须要pass,和continue不同
关于交换ab
只要
a,b=b,a
不需要弄一个新的变量,不用考虑顺序
关于字符串
关于函数
go=0.011
def f(go):
b=1
for i in range(365):
if i%7 in [0,6]:
b-=0.01*b
else:
b+=b*go
return b
a=1
for i in range(365):
a+=0.01*a
while(f(go)<a):
go+=0.001
print("工作日的努力参数是: {:.3f}".format(go))
1.有return
2.有参数,也可全局,但是全局的话不能变值
关于循环
1.range(begin,end,sep):从begin(省略为0)到end,每次走sep步(省略为1)
2.break和continue
和c语言一样
3.循环的else:
若循环没有break,正常结束循环,就进入else
如
for x in range(1,10):
if x==11:
break
print(x,end=' ')
else :
print(2)
#输出1 2 3 4 5 6 7 8 9 2
但是elif无效