python学习——day02
本文参与「少数派读书笔记征文活动」https://sspai.com/post/45653
参考文章:https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/001431752945034eb82ac80a3e64b9bb4929b16eeed1eb9000
今天学到的小技巧(pycharm开发工具):
1.当前python文件调用同一路径下另一python文件中的函数:
File->Settings->搜索Python Console->勾选Add source roots to PYTHONPATH,然后右键项目Mark Directory as->Sources Root
2.不同路径下函数的调用:
import sys
sys.path.append('要调用的py文件的相对路径')
import+要调用的python文件名
3.字体放大/缩小:
File->Settings->Keymap->搜索Increase Font Size/Decrease Font Size->双击->Add Mouse Shortcut
4.Ctrl+B:查看源代码 Ctrl+Q:查看函数文档 Ctrl+鼠标:查看内置函数 Ctrl+Alt+L:代码一键规范 Ctrl+Shift+ +/-:展开/收缩代码
time库:处理时间的标准库(最基础的)
1.时间获取:
- time():获取计算机内部时间值(时间戳),浮点数
- ctime() :获取时间并以易读方式表示,字符串
- gmtime():获取时间表示为计算机可处理的模式(即其他程序可以利用)
2.时间格式化:
strftime(tpl,ts): tpl是格式化模版字符串,ts是计算机内部时间类型变量
t=time().gmtime()
time.strftime(“%Y-%m-%d %H:%M:%S”,t)
备注:Y/年份(0000~9999) m/月份(01~12) B/月份名称(January~December) b/月份名称缩写(Jan~Dec) d/日期(01~31)A/星期(Monday~Sunday) a/星期缩写(Mon~Sun) H/24小时制(00~23)h/12小时制(01~12) p/上下午(AM,PM) M/分钟(00~59) S/秒(00~59)
- strptime(str,tpl):将字符串转换为时间,str为字符串形式时间值
3.程序计时:测量起止动作所经历的时间过程
sleep(s) :产生时间,使程序休眠,单位是秒,可是是浮点数。
def wait():
time.sleep(3.3) #程序在此处等待3.3秒再进一步向下运行perf_counter():测量时间,可以获取计算机中央处理器CPU的时钟,非常精准。(计数值起点不确定,连续调用差值才有意义)
start=time.perf_counter()
end=time.perf_counter() #函数的每次调用都是基于上一次调用
end-startTestRefresh.py
import time
for i in range(101):print("\r{:3}%".format(i),end="") #end=""不换行,光标处于本行末尾;\r回车,光标回到行首,打印下一次数据,即覆盖旧数据——刷新
time.sleep(1)
TestProBarV2.py
import time
scale=50
print(“执行开始”.center(scale//2,”-“)) #将’-‘填充到两侧,第一个参数为宽度
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,’-‘))
最终输出:—————-执行开始—————
100%[**************************************************->]5.06s
—————-执行结束—————
文本进度条的不同设计函数(9种)
" class="reference-link">
程序的控制结构
1.单分支结构
2.二分支结构
紧凑形式:适用于简单表达式的二分支结构(不支持带=的赋值形式,只支持表达式)
guess=eval(input())
print("猜{}了".format("对" if guess==99 else "错"))
3.多分支结构(if…elif…else)
#CalBMIV1.py
weight,height=eval(input("请输入体重/kg和身高/m,用逗号隔开:")) #eval去掉字符两边引号后,仅剩下——身高,体重
print("身高={:.2f}m 体重={:.2f}kg".format(height,weight))
BMI=weight/pow(height,2)
print("BMI数值为:{:.2f}".format(BMI))
inter,nat="",""
if BMI<18.5:
inter="偏瘦"
nat="偏瘦"
elif 18.5<=BMI<24:
inter="正常"
nat="正常"
elif 24<=BMI<25:
inter="正常"
nat="偏胖"
elif 25<=BMI<28:
inter="偏胖"
nat="偏胖"
elif 25<=BMI<30:
inter="偏胖"
nat="肥胖"
else:
inter="肥胖"
nat="肥胖"
print("国际诊断结果为"+inter)
print("国内诊断结果为"+nat)
#print("BMI指标为:国际'{0}',国内'{1}'".format(inter,nat))
输入:请输入体重/kg和身高/m,用逗号隔开:49,159
输出:身高=159.00m 体重=49.00kg
BMI数值为:0.00
国际诊断结果为偏瘦
国内诊断结果为偏瘦
4.条件判断及组合
条件组合保留字:and(&&) or(||) not(!)
5.程序的异常处理
基本使用
try:
<语句块1>
except[异常类型]: #异常类型的名字在python已预定义(如:NameError)
<语句块2> #出现相应异常时执行
高级使用:
try:
<语句块1>
except[异常类型]:
<语句块2>
else:
<语句块3> #不发生异常时执行
finally:
<语句块4> #无论是否发生异常都会执行
程序的循环结构
1.遍历循环(从遍历结构中逐一提取元素放入循环变量)
for <循环变量> in <遍历结构>
<语句块>
例:for i in range(M[,N],[,K]): #K为步长
print(i)
例:for c in s: #s为字符串;c为字符
print(c,end=”,”)
例:for item in ls: #ls为列表
print(item,end=”,”)
例:for line in fi: #fi为文件标识符,遍历其每行,产生循环
<语句块>
2.无限循环
while <条件>:
<语句块>
循环控制保留字:break和continue
循环的扩展(循环与else):当循环没有被break语句退出时,执行else语句块,即else语句块作为“正常”完成循环的奖励(与异常处理的else同理)
#TestCircle
for c in "PYTHON":
if c=="T":
continue
print(c,end="")
else:
print("正常退出")
for c in "PYTHON":
if c=="T":
break
print(c,end="")
else:
print("正常退出")
输出:PYHON正常退出
PY
random库:是使用伪随机数(根据随机数种子并采用梅森旋转算法生成的伪随机序列中的元素)的Python标准库
1.基本随机数函数:
seed(N) :(若后续程序需要再现随机过程),则调用此函数初始化给定的随机数种子N;若不调用此函数,默认为当前系统时间
random():生成一个[0.0,1.0]之间的随机小数
2.扩展随机数函数:
randint(a,b) :生成[a,b]之间的整数
getrandbits(k):生成一个k比特长的随机整数
uniform(a,b) :生成一个[a,b]之间的随机小数(精度为小数点后16位)
randrange(m,n[,k]):生成一个[m,n]之间步长为k的随机整数
choice(seq) :从序列seq中随机选择一个元素
shuffle(seq):将序列seq中元素随机排列,返回打乱后的序列
s=[1,2,3,4,5,6,7,8,9];random.suffle(s);print(s) #在python多句程序排于一行用分号隔开
输出:[3,5,8,9,6,1,2,7,4]
#CalPiV1.py
#利用数学公式计算π值
pi=0
N=100 #累加数量
for k in range(N):
pi+=1/pow(16,k)*( \
4/(8*k+1)-2/(8*k+4)- \
1/(8*k+5)-1/(8*k+6)) #加斜杠\使代码换行
print("圆周率值是:{}".format(pi))
#CalPiV2.py
#蒙特卡罗方法求解π(计算思维[非数学思维]:抽象一种过程,用计算机自动化求解)
import random as ran
import time as ti
DARTS=1000*10000 #撒点数
hits=0.0 #位于圆内部的点数量
start=ti.perf_counter() #启动计时
#开始撒点
for i in range(1,DARTS+1):
x,y=ran.random(),ran.random() #生成随机落点坐标(0~1)
dist=pow(x**2+y**2,0.5) #求点到圆心的距离
if dist<=1.0: #假设圆的半径为1
hits=hits+1
pi=4*(hits/DARTS)
print("圆周率值是:{}".format(pi))
print("运行时间是:{:.5f}s".format(ti.perf_counter()-start))
函数(完整代码的封装)
参数:
位置参数
def power(x):
return x * x
power(5)
输出:25
默认参数
def enroll(name, gender, age=6, city=’Beijing’):
print('name:', name)
print('gender:', gender)
print('age:', age)
print('city:', city)
enroll(‘Sarah’,’F’)
输出 Sarah
gender: F
age: 6
city: Beijing
可变参数(允许传入0个或任意个参数,自动组装为tuple)
TestFunctionV1.py
可变参数传递
def fact(n,*b): #b是一个元组
s=1
for i in range(1,n+1):s*=i
for item in b:
s*=item
return s
print(fact(10,3,5,8)) #计算完10的阶层后又连续乘以3/5/8
输出:435456000
关键字参数(允许传入0个或任意个含参数名的参数,自动组装为dict)
def person(name, age, **kw):
print('name:', name, 'age:', age, 'other:', kw)
person(‘Adam’,45,gender=’M’,job=’Engineer’)
输出:name: Adam age: 45 other: {‘gender’: ‘M’, ‘job’: ‘Engineer’}
命名关键字参数(限制传入的关键字参数,和关键字参数不同,命名关键字参数需要一个特殊分隔符*,*后面的参数被视为命名关键字参数)
def person(name, age, *, city, job): #只能传入city和job两种关键字参数
print(name, age, city, job)
person(‘Jack’, 24, city=’Beijing’, job=’Engineer’) #必须传入参数名,若缺少参数名city和job,Python解释器把这4个参数均视为位置参数,但person()函数仅接受2个位置参数。
输出:Jack 24 Beijing Engineer
- 参数组合(可同时选用必选参数、默认参数、可变参数、关键字参数和命名关键字参数,但定义的顺序必须是:必选参数、默认参数、可变参数、命名关键字参数和关键字参数)
注意:对于任意函数,都可以通过类似func(*args, **kw)的形式调用。
函数的返回值return: 可以传递0个返回值或任意多个返回值,返回类型为元组(a,b,c))
局部变量:函数内部使用的变量
全局变量:函数外部使用的变量
注意:可以使用global保留字在函数内部使用全局变量;
局部变量与内部变量是不同的变量,即使它们的值相同;
当前函数运行结束,局部变量内存释放;
全局变量则会一直存在到程序结束;
局部变量为组合数据类型且未创建,等同于全局变量(!是否真实创建->【指针】)
lambda保留字定义的函数:一种匿名函数,即没有名字的函数,它返回函数名作为结果(仅用于定义简单的,一行内的函数,主要用于一些特定函数或方法的参数)
<函数名>=lambda<参数>:<表达式>
f=lambda x,y:x+y
f(10,15)
输出:25
f=lambda:"lambda函数" #无参数
print(f())
输出:lambda函数
七段数码管显示(系统时间)
#DrawDigitsV1.py
import turtle
def drawGap(n): #设置数码管或字符间隔
turtle.penup()
turtle.forward(n)
def drawLine(draw): #绘制单段数码管
drawGap(5)
turtle.pendown() if draw else turtle.penup()
turtle.forward(40)
drawGap(5)
turtle.right(90)
def drawDigit(digit): #根据数字绘制七段数码管
drawLine(True) if digit in[2,3,4,5,6,8,9] else drawLine(False)
drawLine(True) if digit in[0,1,3,4,5,6,7,8,9] else drawLine(False)
drawLine(True) if digit in[0,2,3,5,6,8,9] else drawLine(False)
drawLine(True) if digit in[0,2,6,8] else drawLine(False)
turtle.left(90)
drawLine(True) if digit in[0,4,5,6,8,9] else drawLine(False)
drawLine(True) if digit in[0,2,3,5,6,7,8,9] else drawLine(False)
drawLine(True) if digit in[0,1,2,3,4,7,8,9] else drawLine(False)
turtle.left(180)
#drawDigit(9)
#turtle.done()
# DrawDigitsV2.py
import turtle
import time
import DrawDigitsV1 as drawv1 # 引用同一文件路径下另一.py文件函数
# def drawGap(): #设置字符间隔(相当于实现空格效果)
# turtle.penup()
# turtle.forward(20)
def drawDate(date): # 获得要输出的数字
for i in date:
if i == '-':
turtle.write('年', font=("Arial", 18, "normal")) # 输出字符串
turtle.pencolor("green")
turtle.fd(20)
elif i == '=':
turtle.write('月', font=("Arial", 18, "normal"))
turtle.pencolor("blue")
turtle.fd(20)
elif i == '+':
turtle.write('日', font=("Arial", 18, "normal"))
turtle.pencolor("pink")
turtle.fd(20)
elif i == ':':
turtle.write(':', font=("Arial", 18, "bold"))
turtle.fd(20)
else:
drawv1.drawDigit(eval(i))
drawv1.drawGap(20)
def main():
turtle.setup(1300, 400, 200, 200)
turtle.penup()
turtle.fd(-620)
turtle.pensize(5)
turtle.pencolor("red")
str = time.strftime("%Y-%m=%d+%H:%M:%S")
drawDate(str)
turtle.hideturtle() # “海龟”隐身
turtle.done()
main()
最终输出:
还没有评论,来说两句吧...