一、温度转换
摄氏度,华氏度的转换。
1. 问题分析
- 直接将温度转换
- 输入输出格式设计:标识放在温度最后,F表示华氏度,C表示摄氏度。
- 算法设计:转换公式:
C = (F - 32) / 1.8
F = C * 1.8 + 32
- 将温度信息发布的声音或图像形式进行理解和转换
- 监控温度信息发布渠道,实时获取并转换温度值
TempStr = input("请输入带有符号的温度值")
if TempStr[-1] in ['F', 'f']:
C = (eval(TempStr[0:-1]) - 32) / 1.8 # eval() 去掉参数最外侧引号,并执行余下语句
print("转换后的温度是{:.2f}C".format(C))
elif TempStr[-1] in ['C', 'c']:
F = 1.8 * eval(TempStr[0:-1]) + 32
print("转换后的温度是{:.2f}F".format(F))
else:
print("输入格式错误")
TempStr = input("请输入带有符号的温度值")
if TempStr[0] in ['F', 'f']:
C = (eval(TempStr[1:]) - 32) / 1.8 # eval() 去掉参数最外侧引号,并执行余下语句
print("转换后的温度是C{:.2f}".format(C))
elif TempStr[0] in ['C', 'c']:
F = 1.8 * eval(TempStr[1:]) + 32
print("转换后的温度是F{:.2f}".format(F))
else:
print("输入格式错误")
2. 举一反三
- 输出输出的转换
- 计算问题的扩展
如:货币的换算。
CurStr = input()
if CurStr[:3] == "RMB":
print("USD{:.2f}".format(eval(CurStr[3:]) / 6.78))
elif CurStr[:3] in ['USD']:
print("RMB{:.2f}".format(eval(CurStr[3:]) * 6.78))
二. turtule库的使用
1. turtle库基本介绍
Python标准库之一,入门级的图形绘制函数库
标准库:
Python计算生态 = 标准库 + 第三方库
标准库:随解释器直接安装到操作系统中的功能模块
2. turtle绘图窗体布局
turtle.setup()
3. turtle空间坐标体系
- 绝对坐标
turtle.goto()
- 海龟坐标(相对坐标)
turtle.circle()
turtle.bk()
turtle.fd()
4. turtle角度坐标体系
- 绝对角度
turtle.seth() # 只改变方向,不前进
- 海龟角度(相对角度)
turtle.left()
turtle.right()
5. RGB色彩体系
- RGB每色取值范围0-255整数或0-1小数。
turtle.colormode() # 默认采用小数值,切换采用整数值
6. 库引用与import
import <库名> # 引用方式:<库名>.<函数名>(<函数参数>)
from <库名> import <函数名> # 引用方式:<函数名>(<函数参数>)
from <库名> import * # 引用方式:<函数名>(<函数参数>)
import <库名> as <库别名> # 引用方式:<库别名>.<函数名>(<函数参数>)
7. turtle画笔控制函数
turtle.penup() # 抬起画笔
turtle.pendown() # 放下画笔
turtle.pensize() # 画笔宽度
turtle.pencolor() # 画笔颜色
8. turtle运动控制函数
turtle.fd() # 向前行进
turtle.circle() # 走曲线
9. turtle方向控制函数
turtle.setheading() # 改变行进方向
turtle.left()
turtle.right()
10. 循环语句与range()函数
for <变量> in range(<次数>):
<被循环执行的语句>
range()
函数
产生循环计数序列
range(N)
:产生0到N-1的整数序列,共N个。
range(M,N)
:产生M到N-1的整数序列,共N-M个。
11. 绘制图形
- 绘制四边形
import turtle as t
t.pensize(4)
t.pencolor('purple')
for i in range(4):
t.fd(150)
t.left(90)
t.done()
- 绘制六边形
import turtle as t
t.pensize(2)
for i in range(6):
t.fd(100)
t.left(60)
t.done()
- 绘制混叠形
import turtle as t
t.pensize(2)
for i in range(9):
t.fd(100)
t.left(80) # 720/9
t.done()
- 绘制风车
import turtle as t
t.pensize(2)
for i in range(4):
t.seth(90 * i)
t.fd(100)
t.right(90)
t.circle(-100, 45)
t.goto(0, 0)
t.done()
三. 基本数据类型
1. 字符串类型的格式化
2. 三次方格式化
获得用户输入的一个数字,可能是整数或浮点数,a,计算a的三次方值,并打印输出。
输出结果采用宽度20个字符、居中输出、多余字符采用减号(-)填充。
如果结果超过20个字符,则以结果宽度为准。
a = eval(input("输入一个整数或浮点数"))
print("其三次方为 {:-^20}".format(pow(a,3)))
input()
3. 星号三角形
读入一个整数N,N是奇数,输出由星号字符组成的等边三角形,要求:
第1行1个星号,第2行3个星号,第3行5个星号,依次类推,最后一行共N的星号。
N = eval(input("输入一个奇数N"))
for i in range(1, N+1, 2):
print("{0:^{1}}".format("*"*i, N)) # 冒号前的0表示,将format函数内的第0个参数进行格式化输出
例如:
print("{0:=^5}\n{1:=<5}\n{2:=>5}".format("iii", "jjj", "kkk"))
=iii=
jjj==
==kkk
4. 凯撒密码
恺撒密码是古罗马恺撒大帝用来对军事情报进行加解密的算法,它采用了替换方法对信息中的每一个英文字符循环替换为字母表序列中该字符后面的第三个字符,即,字母表的对应关系如下:
原文:A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
密文:D E F G H I J K L M N O P Q R S T U V W X Y Z A B C
对于原文字符P,其密文字符C满足如下条件:C=(P+3) mod 26
上述是凯撒密码的加密方法,解密方法反之,即:P=(C-3) mod 26
假设用户可能使用的输入包含大小写字母azAZ、空格和特殊符号,请编写一个程序,对输入字符串进行恺撒密码加密,直接输出结果,其中空格不用进行加密处理。使用input()获得输入。
bef = input('请输入包含大小写字母a~z,A~Z、空格和特殊符号的字符串')
cs=""
for s in bef:
if 'a' <= s <= 'z':
cs += chr(ord('a') + (ord(s) - ord('a') + 3) % 26)
elif 'A' <= s <= 'Z':
cs += chr(ord('A') + (ord(s) - ord('A') + 3) % 26)
else:
cs += s
print(cs)
补充:
print("kkk", end = "") # end = ""表示输出之后不换行(因为python运行完print语句后会自动换行)
四. 程序的控制结构
1. 程序的异常处理
try:
<语句块1>
except:
<语句块2>
try:
<语句块1>
except<异常类型>:
<语句块2>
try:
<语句块1>
except:
<语句块2>
else:
<语句块3> # 在不发生异常时执行
finally:
<语句块4> # 不论异常有没有发生,一定执行
2. 遍历循环
for <循环变量> in <遍历结构>:
<语句块>
遍历结构可以是列表,字符串,文件等。
3. random库的使用
伪随机数:采用梅森旋转算法生成的(伪)随机序列中的元素
3.1 random库概述
基本随机数函数:seed(),random()
扩展随机数函数:randint(), getrandbits(), uniform(), randrange(), choice(), shuffle()
3.2 基本随机数函数
随机数种子 -> 梅森随机算法 -> 随机序列
seed(a = None)
:初始化给定的随机数种子,默认为当前系统时间
random()
:生成一个[0, 1)之间的随机小数
当random.seed()内的参数确定后,即随机数种子确定后,random.random()生成的随机数也就确定了。因此,随机数是可以复现的。
3.3 扩展随机数函数
randint(a, b)
:生成一个[a, b]之间的整数
randrange(m, n, [k])
:生成一个[m, n)之间以k为步长的随机整数
getrandbits(k)
:生成一个k比特长的随机整数
uniform(a, b)
:生成一个[a, b]之间的随机小数
choice(seq)
:从序列seq中随机选择一个元素
shuffle(seq)
:将序列seq中元素随机排列,返回打乱后的序列
4. 整数的加减和
编写程序计算如下数列的值:
1-2+3-4…966
其中,所有数字为整数,从1开始递增,奇数为正,偶数为负
sum = 0
for i in range(1,967):
if i % 2 == 0:
sum = sum - i
else:
sum = sum + i
print("结果为:", sum)
结果为: -483
5. 三位水仙花数
“水仙花数"是指一个三位整数,其各位数字的3次方和等于该数本身。
例如:ABC是一个"3位水仙花数”,则:A的3次方+B的3次方+C的3次方 = ABC。
请按照从小到大的顺序输出所有的3位水仙花数,请用"逗号"分隔输出结果。
nar = ""
for i in range(100,1000):
sum = 0
for j in str(i):
sum = sum + pow(eval(j),3)
if sum == i:
nar = nar + "{},".format(i)
print("三位水仙花数为:", nar[0:-1])
三位水仙花数为: 153,370,371,407
6. 用户登录的三次机会
给用户三次输入用户名和密码的机会,要求如下:
1)如输入第一行输入用户名为‘Kate’,第二行输入密码为‘666666’,输出‘登录成功!’,退出程序;
2)当一共有3次输入用户名或密码不正确输出“3次用户名或者密码均有误!退出程序。”。
count = 0
while count < 3:
name = input("请输入用户名:")
passkey = input("请输入密码:")
if name == 'Kate' and passkey == '666666':
print("登录成功!")
break
else:
count += 1
if count == 3:
print("3次用户名或者密码均有误!退出程序。")
请输入用户名:Kate
请输入密码:666666
登录成功!
五. 函数和代码复用
1. 可选参数传递
def <函数名>(<非可选参数>, <可选参数>): # 非可选参数一定要在可选参数之前
<函数体>
return <返回值>
例如:
def fact(n, m = 1): # 如果调用函数时没有给m赋值的话,m默认为1
s = 1
for i in range(1, n + 1):
s *= i
return s // m
2. 可变参数传递
def <函数值>(<参数>, *b): #可变参数一般放在参数的最后面
<函数体>
return <返回值>
例如:
def fact(n, *b): # 调用此函数时,可如此调用:fact(10, 1); fact(10, 1, 3, 5)
s = 1
for i in range(1, n + 1):
s *= 1
for item in b:
s *= item
return s
3. 局部变量和全局变量
规则1:局部变量和全局变量是不同变量
- 局部变量是函数内部的占位符,与全局变量可能重名但是不同
- 函数运算结束后,局部变量被释放。
- 可以使用
global
保留字在函数内部使用全局变量
规则2:局部变量为组合数据类型且未创建,等同于全局变量
组合类型:如列表。
ls = ["F","f"] # 通过使用[]真实创建了一个全局变量列表
def func(a):
ls.append(a) # 此处改变的是全局变量ls
return
func("C") # 全局变量ls被修改
print(ls)
ls = ["F","f"] # 通过使用[]真实创建了一个全局变量列表
def func(a):
ls = [] # 此处ls是列表类型,真实创建,ls是局部变量
ls.append(a)
return
func("C") # 局部变量ls被修改
print(ls)
使用规则总结
- 基本数据类型,无论是否重名,局部变量与全局变量不同
- 可通过global保留字在函数内部声明全局变量
- 组合数据类型,如果局部变量未真实创建,则是全局变量
4. lambda函数
lambda函数返回函数名作为结果
lambda函数是一种匿名函数
使用Lambda
保留字定义, 函数名是返回结果
lambda函数用于定义简单的、能够在一行内表示的函数
<函数名> = lambda <参数>: <表达式>
4.1 谨慎使用lambda函数
5. 递归的定义
5.1 递归的两个关键特征
- 链条:计算过程存在递归链条
- 基例:存在一个或多个不需要再次递归的基例
5.2 递归的实现
- 递归本身是一个函数,需要函数定义方式描述
- 函数内部,采用分支语句对输入参数进行判断
- 基例和链条,分别编写对应代码
例如:求n!
def fact(n):
if n == 0:
return 1
else:
return n * fact(n - 1)