程序语言特点
语言
程序设计语言经历了三个阶段:机器语言→汇编语言→高级语言。
Python 程序不支持自然语言编程方式。自然语言即人与人之间的日常的语言,具有一些歧义性。
嵩天:《全国计算机等级考试二级教程 Python语言程序设计》,教育部考试中心编,北京:高等教育出版社,2022年,第2页。
程序计算思维
(嵩天:《全国计算机等级考试二级教程 Python语言程序设计》,北京:高等教育出版社,2022年,第138页。)
python解释器(interpreter)
Python 程序可以在任何安装了 Python 解释器的计算机环境中执行,因此,可以不经修改地实现跨操作系统运行。→平台无关。
嵩天:《全国计算机等级考试二级教程 Python语言程序设计》,教育部考试中心编,北京:高等教育出版社,2022年,第11页。
python 解释器有两个重要工具。
IDLE (integrated development environment) : Python 集成开发环境,编写和调试 Python 代码
pip : Python 第三方库安装工具, 用来在计算机上安装第三方库。
静态语言(C语言)采用编译方式执行,编译是将源代码(高级语言代码)转换成目标代码(机器语言代码)的过程。编译器(compiler)执行编译。
脚本语言(python语言)采用解释方式执行,解释是将源代码(高级语言代码)逐条转换成目标代码(机器语言代码)同时逐条运行目标代码的过程。解释器(interpreter)执行解释。
编译和解释的区别在于编译是一次性地翻译,一旦程序被编译,不再需要编译程序或者源代码。解释则在每次程序运行时都需要解释器和源代码。
这两者的区别类似于外语资料的翻译和同声传译。
(嵩天:《全国计算机等级考试二级教程 Python语言程序设计》,教育部考试中心编,北京:高等教育出版社,2022年,第2-3页。)
python3.x 版本
python 3.x 不兼容 python 2.x 系列。因为二者语法层面已经有了很大不同。
嵩天:《全国计算机等级考试二级教程 Python语言程序设计》,教育部考试中心编,北京:高等教育出版社,2022年,第5页。
编码和解码
代码如下:
##encode()和decode()
##编码,即将人类语言转换为计算机语言,就是【编码】encode();反之,就是【解码】decode()。它们的用法如下图所表示↓
#编码就是将str类型转换成bytes类型
##将人类语言编码后得到的结果,最前面都有字母b,代表是bytes(字节)类型的数据;\x是分隔符,用来分隔一个字节和另一个字节
##所谓的编码,其实本质就是把str(字符串)类型的数据,利用不同的编码表,转换成bytes(字节)类型的数据
print("朱元虎".encode("utf-8"))
print("朱元虎".encode("gbk"))
print(b'\xe6\x9f\xaf\xe4\xbd\xb3\xe5\xac\xbf'.decode('utf-8'))
#将\x替换为%,就是网址中的搜索条件了,百度搜索“柯佳嬿”↓
Unicode编码
unicode是一种常用国际编码
即可完成。
IPO程序
程序的基本编写方式:
I:input 输入
P :process 处理
O:output 输出
Python语句基础
输入input() 输出print()
input() :获得用户的输入,并返回字符串数据。
符号“< >”说明:从很多名称的事物中提炼出普遍性东西,即从特殊到一般,用符号“<>”表示一般性的东西。
<变量> = input("<提示性文字>")
name=input("请输入你的名字:")
print(name)
print(): 输出运算结果。
输出皮卡丘图像,代码如下:
myPicture="""
へ /|
/\7 ∠_/
/ │ / /
│ Z _,< / /`ヽ
│ ヽ / 〉
Y ` / /
イ● 、 ● ⊂⊃〈 /
() へ | \〈
>ー 、_ ィ │ //
/ へ / ノ<| \\
ヽ_ノ (_/ │//
7 |/
>―r ̄ ̄`ー―_
"""
print(myPicture)
print("""
へ /|
/\7 ∠_/
/ │ / /
│ Z _,< / /`ヽ
│ ヽ / 〉
Y ` / /
イ● 、 ● ⊂⊃〈 /
() へ | \〈
>ー 、_ ィ │ //
/ へ / ノ<| \\
ヽ_ノ (_/ │//
7 |/
>―r ̄ ̄`ー―_
""")
注意print()括号中的逗号并不会输出,代码如下:
x=520.1314
print(round(x,2),round(x))
print(1,2)
输出结果如下,逗号并没有出现。
520.13 520
1 2
即可完成。
赋值语句
对变量进行赋值的一行代码,被称作赋值语句。
赋值语句中,需要使用“=”。如下代码所示:
x=y=3
print(x,y)
注意,不能是下面这样形式
x=2,y=3 #不是赋值语句,运行时候会出错。
x,y=y,x
保留字
保留字 (keyword) ,也称关键字,指被编程语内部定义并保留使用的标识符。Python 的保留字也是大小写敏感的 例如, True 是保留字,但 true 不是保留字。
python 保留字如下:
选学内容涉及的保留字共有5个。
None, finally, lambda, pass,with
转义字符
转义字符
除了\n之外,转义字符还有很多,它们的特征就是:反斜杠+想要实现的转义功能首字母。
比如换行\n代表【+newline】;
退格\b代表【+backspace】;
回车\r代表【+return】。
大家可以按照这种方法记住转义字符的含义。
格式框架
缩进:(Tab 键),体现语句之间的逻辑关系。
注释:#
续行符:\
unexpected indent: 缩进错误。
快捷键
常用快捷
Ctrl + [ 、Ctrl + ] 缩进代码
Alt+3 Alt+4 注释、取消注释代码行
Alt+5 Alt+6 切换缩进方式 空格<=>Tab
Alt+/ 单词完成,只要文中出现过,就可以帮你自动补齐。多按几次可以循环选择
Alt+M 打开模块代码,先选中模块,然后按下此快捷键,会帮你打开改模块的py源码供浏览
Alt+C 打开类浏览器,方便在源码文件中的各个方法体之间切换
Alt+FP 打开路径浏览器,方便选择导入包进行查看浏览
F1 打开Python文档,
Ctrl + Space 完成类、方法、变量名称的自动输入,完成类、方法、变量名称的自动录入
逻辑运算
- 1.异或操作(XOR):当两个操作数不同的时候,结果为1;当两个操作数相同的时候,结果为0。异或操作具有自反性(A XOR A = 0)和交换律(A XOR B = B XOR A)特点。在加密算法、校验和计算、找出数组中出现奇数次的元素等场景中,异或操作被广泛使用。
- 2.或操作(OR):当两个操作数中有一个为1的时候,结果为1;当两个操作数都为0的时候,结 …
3.与操作(AND):当两个操作数都为1的时候,结果为1;当两个操作数有一个为0的时候,结果为0。与操作常用于掩码操作、位运算、逻辑判断等场景。
条件逻辑操作: and , or , xor
三种结构
顺序结构、分支(条件)结构、循环结构。
条件语句
python关系操作符
分支结构的判断条件:能够产生True 或者 False 的语句或者函数。
if elif else
if ...else...
①if 和else所代表的条件是互斥的
②如果不满足if的条件,就执行else的条件
在判断3个或3个以上的条件时,我们就需要借助Python中的多向判断命令:if…elif…else…。
这三者共同构成了多向判断的命令逻辑关系:如果if的条件不满足,就按顺序看是否满足elif的条件,如果不满足elif的条件,就执行else的命令。
第一行的赋值,会按照从上到下的顺序挨个试一遍,看自己满足哪个条件,满足了就不往下走,不满足就继续试,试到出结果为止。
其次,elif的运行本质上和else一样,已经带有其他条件的意思,所以elif后可以不接else。
if if
如下代码所示:
n=eval(input("请输入第一个整数:"))
s = 0
if n >= 7:
n -= 1
s = 4
if n < 7:
n -= 1
s = 3
print(s)
当输入“7”的时候,输出结果如下:
3
这是因为,这个语句是if …… if……,两个if后的语句都会被执行。
当把第二个if改为elif的时候,如下代码:
n=eval(input("请输入第二个整数:"))
s = 0
if n >= 7:
n -= 1
s = 4
elif n < 7:
n -= 1
s = 3
print(s)
当输入“7”的时候,输出结果如下:
4
这是因为,这个语句是if …… elif……,程序选择了符合条件的if语句来执行。
if嵌套
import time
print('如果你想拥有无限的力量和能量,那必须夺得力量宝石')
time.sleep(2)
print('如果你想扭曲时空和任意地传送,那必须夺得空间宝石')
time.sleep(2)
print('如果你想任意地修改现实,无视任何宇宙规律,那必须夺得现实宝石')
time.sleep(2)
print('如果你想到达任何一个时间点,无论是古老的年代还是遥远的未来,那必须夺得时间宝石')
time.sleep(2)
print('如果你想控制生者和死者的灵魂,那必须夺得灵魂宝石')
time.sleep(2)
print('如果你想拥有不朽的精神力量并操控任何人的思维,那必须夺得心灵宝石')
time.sleep(2)
print('那么,如果让你来选择的话,你想要获得哪颗宝石呢?')
time.sleep(2)
print('请在以下六个选项【1 力量宝石 ;2 空间宝石;3 现实宝石 ;4 时间宝石;5 灵魂宝石 ;6 心灵宝石;】中,选择你最想获得的宝石吧!')
time.sleep(3)
answer=input('请将对应数字输入在冒号后: ')
if answer=='1':
print('我告诉你哦,力量宝石保存在山达尔星的新星军团的总部基地')
time.sleep(3)
elif answer=='2':
print('空间宝石在洛基手里')
time.sleep(3)
elif answer=='3':
print('雷击已将现实宝石交给收藏家保管')
time.sleep(3)
elif answer=='4':
print('奇异博士愿意用时间宝石换取钢铁侠的性命')
time.sleep(3)
elif answer=='5':
print('必须献祭自己心爱的人才能得到灵魂宝石')
time.sleep(3)
else:
print('幻视头上的心灵宝石被绯红女巫摧毁,但可用时间宝石复原')
time.sleep(3)
实践:判断奇偶
代码如下:
print("hello world")
num=input("请输入一个整数。")
if num%2==0:
print("是偶数")
else:
print("是奇数")
即可完成。
实践:机器人对话
import urllib.parse
import hashlib
import time
import random
import string
import requests
import sys
import readline
def curl_md5(src):
m = hashlib.md5(src.encode('UTF-8'))
# 将得到的MD5值所有字符转换成大写
return m.hexdigest().upper()
"""
get_req_sign :根据 接口请求参数 和 应用密钥 计算 请求签名
参数说明
-pa:接口请求参数
-apk:应用密钥
返回数据
-签名结果
"""
def get_req_sign(pa, apk):
# 1.字典升序排序
pa_list = list(pa.items())
pa_list.sort()
# 2.拼按URL键值对
tem_str = ''
for i in range(len(pa_list)):
if pa_list[i][1]:
tem_str += (pa_list[i][0] + '=' + urllib.parse.quote(pa_list[i][1]) + '&')
# 3.拼接app_key
tem_str += ('app_key=' + apk)
# 4.MD5运算 + 转换大写,得到请求签名
sign = curl_md5(tem_str)
return sign
def get_params(plus_item):
# 请求时间戳(秒级),用于防止请求重放(保证签名5分钟有效)
t = time.time()
time_stamp = str(int(t))
# 请求随机字符串,用于保证签名不可预测
nonce_str = ''.join(random.sample(string.ascii_letters + string.digits, 10))
global se
app_id = '2127007340'
app_key = '9Fm2D9tkB4lEjZ89'
params = {
'app_id': app_id,
'time_stamp': time_stamp,
'nonce_str': nonce_str,
'question': plus_item,
'sign': '',
'session': se
}
params['sign'] = get_req_sign(params, app_key)
return params
def get_content(plus_item):
# 聊天的API地址
url = "https://api.ai.qq.com/fcgi-bin/nlp/nlp_textchat"
# 获取请求参数
plus_item = plus_item.encode('UTF-8')
payload = get_params(plus_item)
r = requests.post(url, data=payload)
if r.json()["ret"] == 0:
print('吴小枫:' + r.json()["data"]["answer"])
else:
print('今天我出了一点小问题~快联系助教帮忙解决一下~~')
sys.exit()
feature_text = ['''
大家好!我是你的聊天机器人吴小枫。
我有问必答,有人会问我“今天深圳天气怎么样?”,也有人问我“你喜欢我吗?”
快来问我问题呀,欢迎来撩!
>''', '''
再来问我点啥吧!我把我知道的都告诉你,嘻嘻!
>''', '''
# 我有点饿了,再和你聊完最后一句,我就要下线啦!你还有什么要问我的?
# >''']
se = str(random.randint(1, 10000))
for i in range(len(feature_text)):
comment = input(feature_text[i])
get_content(comment)
time.sleep(1)
print('\n我走啦,下次见!')
实践:识别图片文字
import requests
from aip import AipOcr
image = requests.get('https://res.pandateacher.com/python_classic.png').content
APP_ID = '16149264'
API_KEY = 'yxYg9r4OuAs4fYvfcl8tqCYd'
SECRET_KEY = 'yWg3KMds2muFsWs7MBSSFcgMQl8Wng4s'
client = AipOcr(APP_ID, API_KEY, SECRET_KEY)
res = client.basicGeneral(image)
if 'words_result' in res.keys():
for item in res['words_result']:
print(item['words'])
else:
APP_ID = '11756541'
API_KEY = '2YhkLuyQGljPUYnmi1CFgxOP'
SECRET_KEY = '4rrHe2BF828bI8bQy6bLlx1MelXqa8Z7'
client = AipOcr(APP_ID, API_KEY, SECRET_KEY)
res = client.basicGeneral(image)
if 'words_result' in res.keys():
for item in res['words_result']:
print(item['words'])
else:
print(res)
循环语句
for
代码如下:
# -*- coding: utf-8 -*-
"""
Created on Wed Jul 3 12:52:25 2019
@author: cc
"""
week=["Non","Tue","Wed",'Thur',"Fri",'Sat',"Sun"]
i=0
while i<len(week):
print(week[i])
i=i+1
print("星期英文缩写")
for name in week:
print(name)
利用循环绘制图形:
使用turtle 库的turtle.fd()函数和turtle.left()函数绘制一个边长为200像素的正方形及一个紧挨四个顶点的圆形。
代码如下:
import turtle
turtle.pensize(2)
for i in range(4):
turtle.fd(200)
turtle.left(90)
turtle.left(90)
turtle.circle(100*pow(2,0.5))
生成的图形如下:
该图并非所求图形。
修改代码如下:
import turtle
turtle.pensize(2)
for i in range(4):
turtle.fd(200)
turtle.left(90)
turtle.circle(100*pow(2,0.5))#长度为圆的半径。
生成图形如下:
分析原因,首先,乌龟转向的角度需要重新调整。更新代码:
import turtle
turtle.pensize(2)
for i in range(4):
turtle.fd(200)
turtle.left(90)
turtle.right(45)
turtle.circle(100*pow(2,0.5))
生成图形如下:
即可完成。
while
当型 while
a=int(input("Please input a number:"))
num=0
while num<a:
num+=1
print("Study"+str(num))
直到型 while True
"""while True:
do_something
if condition:
break
"""
a,b=map(int,input("Please input two number:").split())
if a<=b:
c=a
a=b
b=c
while True:
m=a-b
if m<=b:
break
else:
while True:
m=a-b
if m<=b:
break
print(m,"is YuShu")
while 循环,语句如下:
# -*- coding: utf-8 -*-
"""
Created on Tue Jul 2 22:09:33 2019
@author: cc
"""
count=int(input("请输入倒计时时间:"))
while count>0:
print(count)
count=count-1
print("发射火箭!")
猜数游戏,代码如下:
# -*- coding: utf-8 -*-
"""
Created on Tue Jul 2 23:02:09 2019
@author: cc
"""
import random
number=random.randint(0,20)
count=0
while True:
a=int(input('请输入0到20之间你猜测的数字:'))
count=count+1
if a==number:
break
elif a>number:
print("你猜的数字大了。")
else:
print("你猜的数字小了。")
print('猜中了,你用了{}次!'.format(count))
多个元素并列求和,代码如下:
# -*- coding: utf-8 -*-
"""
Created on Tue Jul 2 23:37:21 2019
@author: cc
"""
sum=0
count=0
a=[]
while True:
number=int(input("求数据偶数和,请输入整数,如果输入-1,则表示结束:"))
if number==-1:
break
elif number % 2==1:
continue
else:
a.append(number)
sum=sum+number
count=count+1
print("输入偶数如下列表:",a)
print("共有偶数个数{}个,其和为{}".format(count,sum))
即可完成。
continue
while True:
z=input("请输入航天员体重值,输入Q或者q,则退出:")
if z.upper()=="Q":break
elif float(z)==False:print("输入格式有误。")
else:
diqiuz=float(z)+10*0.5
yueqiuz=diqiuz*0.165
print(f"地球重值{diqiuz}kg,月球重值{yueqiuz}kg。")
continue
print("end")
可作参考。
break
else
for i in range(1,10):
if i ==11:
break
else:print(911)#输出911
循环被打断,break,这个时候else语句并没有被执行。
for i in range(1,10):
if i ==8:
break
else:print(911)
缩进
python函数代码中,缩进占据有重要地位,位置不同,影响的结果也不同。
如下代码所示:
for c in "python abc":
if c =="n":
break
print(c)
输出结果为:
p
y
t
h
o
但是,如果print(c)缩进一个,结果则截然不同。如下代码所示:
for c in "python abc":
if c =="n":
break
print(c)
这个时候,程序并没有输出。因为print(c)是在if句子中,受到if控制;而不是在for循环语句中。不受到for的控制,即使for循环了很多,也不会print(c)。
即可完成。
斐波那契
循环案例,代码如下:
for i in range(1,10):
for j in range(1,i+1):
print('{}x{}={}\t'.format(i,j,i*j),end="")
print()
print()
for i in range(1,10):
for j in range(i,10):
print('{}x{}={}\t'.format(i,j,i*j),end="")
print()
#斐波那契数列
'''
0,1,是前两项。从第三项开始,每一项等于前两项和。
'''
#第一项和第二项
a1=0
a2=1
count=2
#判断输入多少项目
number=int(input("你需要几项?请输入:"))
if number<=0:
print("请输入正整数。")
elif number==1:
print("斐波那契数列:0")
else:
print(a1,",",a2,end=", ")
while count<number:
an=a1+a2
a1=a2
a2=an
print(an,end=", ")
count+=1
即可完成。
绘制螺线
import turtle
import time
myjiaodu=int(input("请输入旋转角度:"))
turtle.tracer(False)
#turtle.speed("fastest")#画笔速度
turtle.pensize(2)
turtle.bgcolor("white")
colors=["red","yellow","blue","purple"]
for i in range(400):
turtle.forward(2*i)
# turtle.color(colors[i%4])
turtle.left(myjiaodu)
turtle.done()
输出汉字大写数字的章节数
目的:输出汉字大写数字的章节数,为PDF文档作书签。
idict={}
numList=[str(i) for i in range(0,10)]#需要用字符串的形式,这样才能把各个位数上的数字转化为汉语大写形式
bstr="〇一二三四五六七八九"
xy=zip(numList,bstr)
for i in xy:
idict[i[0]]=i[1]#{字符串数字:汉字大写数字;}构成字典对应关系
mydict={}
for i in range(1,101):
numStr=str(i)
hysz=""#汉语数字
for m in numStr:
hysz+=idict[m]#字典常用格式
mydict[str(i)]=hysz
wfile=open("wfile.txt","w",encoding="utf-8")
for (x,y) in mydict.items():
print("卷",y,sep="",file=wfile)
wfile.close()
分析如下:
{字符串数字:汉字大写数字;}构成字典对应关系。
把数字转化为字符串,158转化为“1”、“5”、“8”,依次取其对应的汉字大写数字。
构造九九乘法表
构造九九乘法表,可以运用循环结构,也可以构造一个函数。
#先弄出每一行。
def printLine(N):
for i in range(1,N+1):
print(f"{i}*{N}={i*N}",end=' ',sep=' ')
print()
for N in range(1,9):
printLine(N)
如下代码也可以,略微整齐形式。
#9*9列表的处理。调试一下,很快就做出来了,并不难。注意第二个循环的n在前面
for m in range(1,10):
print(" "*(9-m),sep=' ',end='')
for n in range(1,m+1):
print(f'{n}*{m}=',str(m*n).center(2),sep=' ',end=' ')
print()