程序设计基础理论
一.理论知识:
1.发展历程:机器语言→汇编语言#(前两个直接操作计算机硬件)→高级语言(与硬件无关、用于表达语法逻辑更接近自然语言)
2.高级语言→静态语言--编译--源代码一下子转换成目标代码--翻译--翻译过一次就不需要编译程序或者源代码(C语言),脚本语言--解释--逐条转换并运行--同声传译--每次运行都需要解释器和源代码(python)
3.程序的构成:输入数据(文件输入、网络输入、控制台输入、交互界面输入、随机数据输入、内部参数输入)、处理数据、输出数据(控制台输出、图形输出、文件输出、网络输出、操作系统内部变量输出)----IPO程序编写方法包括输入、处理、输出
4.Python通过缩进来体现语句之间的逻辑关系
5.Python3.x(解释器都采用Unicode进行编码表达所有字符信息)无法兼容python2.x的既有语法
6.运行python程序的两种方式:交互式、文件式(IDLE--内置的集成开发工具都支持)
例题:
斐波那切数列
a , b = 0 , 1
while a<1000:
print(a, end=",")
a , b = b , a+b
While循环用冒号,不用加括号
输出后面加上某个符号,可以用,end=” “
如果a与b要直接交换可以进行直接的兑换
圆面积的计算(半径25)
r = 25
area=3.1415 * r * r
print(area)
print("{:.2f}".format(area))
只留两位小数:”{:.2f}”.format()
个例:
>>>2048/1024
2.0
>>>10in [10,11]
True
>>>list(range(5))
[0,1,2,3,4,5]
不过这都没有关系,后面细讲
二.基本语法元素:
1.格式框架
缩进:开始前的空白区域(Tab),表示python程序间的包含和层级关系--用来表示程序逻辑
错误类型:unexpected indent
注释:#可用于任何位置
“”也可
2.语法元素
变量:赋值(可以自加 i += 1)(判断:无需先创建和赋值而直接使用--错误)
命名:大小写字母、数字、下划线、汉字等字符组成;首字母不能为数字;标识符中间不能有空格,长度没有限制;对大小写敏感
保留字:共33个(下面会进行学习)
3.数据类型
数字、字符串、元组、集合、列表、字典
进制:十六进制0x 八进制0o 二进制0b
字符串:(见后)
4.语句元素
数据+操作符
赋值:变量=表达式
同步赋值: 变量1,变量2,变量3=表达式1,表达式2,表达式3
交换:a,b=b,a
引用:
import<功能库名称>
<功能库名称>.<函数名称>
turtle.fd
5.输入输出函数
1)input函数
<变量>=input(<提示性文字>)
A = input(“请输入一个小数:”)
B = input()
2)eval函数
去掉字符串最外面的引号
A = eval(“1234”)#A=数字1234
A = eval(“123+123”)#A=246
当然不能把字符串的引号去掉,不然会报错:A=eval(“pyboook”)//NameError
应该改为:A=eval(“’pybook’”)
经常与input函数连用A=eval(input(<提示性文字>))
3)print()函数
print(<”待输出字符串”>)
print(value,value,calue)
print(“数字{}和数字{}的乘积是{}”.format(a,b,a*b))
print(a, end=”.”)#一般为默认增加换行,end后面加输出的结尾且不会自动产生换行
6.倒叙
输入:我喜欢莎士比亚
输出:亚比士莎欢喜我
s = input("请输入一段文本:")
i = len(s)-1
while i>=0 :
print(s[i],end="")
i=i-1#i += -1
damn!这题我的二级考试的时候就类似的考到了(但不太一样)
三.数据类型
1.整数
不同进制的整数可以直接运算
2.浮点数
科学计数法 -1.01e3即为-1010.0(以10为基数,-1.01*10^3)
pow(a,b)即为a^b(整数运算精度比浮点数更高)或者a**b,pow函数比普通运算速度更快
不确定尾数:0.1 + 0.2 == 0.3#False
排除不确定尾数的干扰:round函数进行小数点后四舍五入
round(a,b)如:round(1.2356,2)#1.24 round(1.228976,1)#1.2
3.复数
基本单位:j
表达方式:a+bj
提取方式:z.real z.image
如:(1.23e4+5.67e4j).real #1230
(1.23e4+5.67e4j).image #5670
如果:1.23e4+5.67e4j.image #69000.0
先获得5.67e4j的虚部再与1.23e4求和计算
(包括之后遇到的题都可以进行类推)
4.运算
整数与浮点数混合→浮点数
整数之间的运算类型与操作符相关→/运算的结果是浮点数→1010/10=101.0
整数和浮点数与复数运算→复数
//取整 **次幂
X op = y 等价于 X = X op y
5.一些有关的内置函数
>>>abs(-30)
30#取绝对值
>>>abs(30+40j)
50.0#在复数情况时平方和开方
>>>divmod(10,3)
(3,1)#(10//3,10%3)整除,mod余数
>>>c = divmod(10,3)
>>>c[0]
3
>>>pow(4,10,2)
0#4^10%2(4的十次方%2)
>>>pow(2,4)
16(2的四次方)
>>>round(1.24)
1#四舍五入为整数
>>>round(1.24,1)
1.2#四舍五入位小数
>>>min(a,b,c,d)
>>>max(a,b,c,d)
6.字符串
单行字符串用” “ ‘ ‘
多行字符串用’’’ ‘’’
>>>print(‘’’这是’多行字符串’的第一行
这是’多行字符串’的第二行
‘’’)
这是’多行字符串’的第一行
这是’多行字符串’的第二行
7.转义字符
\n换行 \\反斜杠 \’单引号 \”双引号 \t(tab字符) \续行
比如:
if (a>10 and a<100) or \
(a <-10 and a > -100):
print(‘Bingo’)
8.索引
<字符串或者字符串变量名>[序号]
>>>”对酒当歌,人生几何?”[1]
‘酒’#正数从0开始从左数
>>>”对酒当歌,人生几何?”[-1]
‘?’#负数从-1开始从右数,标点符号算一个字符
>>>”譬如朝露,去日苦多。”[2:4]
‘朝露’#从2到4不包括4
>>>”譬如朝露,去日苦多。”[4:2]
‘’
>>>”譬如朝露,去日苦多。”[5:-2]
‘去日苦’#也是不包含-2
>>>”譬如朝露,去日苦多。”[5:]
‘去日苦多。’
>>>s = “青青子衿悠悠我心。”
>>>s[5]
‘悠’
9.format()
>>>”{}曰:学而时习之,不亦{}?”.format(“孔子”,”说乎”)
‘孔子曰:学而时习之,不亦说乎?’#{}内可以按顺序填入
>>>”{1}曰:学而时习之,不亦{0}?”.format(“说乎”,”孔子”)
‘孔子曰:学而时习之,不亦说乎?’#{序号--与参数的对应关系}→可以用于{}数量与后面不对等时
>>>”《论语》是{}弟子所著。{}曰:学而时习之,不亦说乎。”.format(“孔子”)
#IndexError错误,个数不相符,应改为:
>>>”《论语》是{0}弟子所著。{0}曰:学而时习之,不亦说乎。”.format(“孔子”)
‘《论语》是孔子弟子所著。孔子曰:学而时习之,不亦说乎。’
#如果要输出{},则要输出{{}}
>>>s=”等级考试”
>>>”{:25}”.format(s)
‘等级考试 ‘#左对齐
>>>”{:>25}”.format(s)
‘ 等级考试’#右对齐
>>>”{:^25}”.format(s)
‘ 等级考试 ‘#居中对齐
>>>{:*^25}”.format(s)
‘***********等级考试*********’#居中对齐内填充,可以任何符号,比如*、是
>>>”{:1}”.format(s)
‘等级考试’#当数值较小的时候,直接原式输出
>>>s , y = “等级考试” , “-”
>>>”{0:{1}^{2}}”.format(s,y,25)
‘-----------等级考试-----------’
>>>z = “^”
>>>”{0:{1}{2}{3}}”.format(s,y,z,25)
>>>”{:.2f}”.format(123.4567)
123.46#两位小数四舍五入
>>>”{:>25.3f}”format(123.4567)
‘ 123.457’#就是上面几种的综合
>>>”{:.5f}”format(“全国计算机等级考试”)
‘全国计算机’
>>>”{:b},{:c},{:d},{:o},{:x},{:X}”.format(425)
‘11010101001,∑,425,651,1a9,1A9#b二进制,cUnicode,d十进制,o八进制,x小写十六进制,X大写
>>>”{:.2e},{:.2E},{:.2f},{:2%}”.format(3.141)
‘3.14e+00,3.14E+00,3.14,314.10%’
10.字符串操作
X+y 直接连接X和y
X*n或者n*X 复制n次X
X in s 判断X是不是s的子字符串(True、False)
>>>len(“全国计算机等级考试Python语言课目”)
19#求长度,中文和英文字符都算(根据Unicode)
>>>str(1010)
‘1010’#转换成字符串
>>>str(0x3F)
‘63’#还能转换成十进制
>>>chr(1010)
‘c’#转换成Unicode对应字符
>>>ord(“和”)
21644#转换对应编码
>>>hex(1010)
‘0x3f2’#转换成十六进制的字符串
>>>oct(-255)
‘0o1762’#转换成八进制的字符串
>>>”Python”.lower()
‘python’
>>>”Python”.upper()
‘PYTHON’
>>>”Python is an excellent language.”.split()
[‘Python’,’is’,’an’,’excellent’,’language.’]#用逗号隔开,默认为空格分词
>>>”Python is an excellent language.”.split(‘a’)
[‘Python is’,’n excellent l’,’ngu’,’ge.’]#以a为分隔界限进行分割,其中a直接被切除
>>>”Python is an excellent language.”.count(‘a’)
3#数个数
>>>”Python is an excellent language.”.replace(‘a’,’#’)
‘Python is #n exxcellent l#ngu#ge.’#把前面那个出现的用后面的进行替换
>>>”Python”.center(20,”=”)
‘=======Python======’#自动居中,后面填充=,可以类比于
>>>”{:=^20}”.format(“Python”)#同上
>>>” ==Python== “.strip(‘’)
‘==Python==’#默认去掉左边和右边的空格
>>>” ==Python== “.strip(“=n”)
‘Pytho’#左侧和右侧都去除strip内的所有元素,只是元素,不限位置
>>>””.join(‘PYTHON’)
‘P Y T H O N’#一般都会用join来加分隔符,默认空格
>>>”,”.join([‘1’,’2’,’3’,’4’])
‘1,2,3,4’
11.类型转换与判断
>>>type(10.10)
<class ‘float’>#判断类型
转换:int() str() float()
12.凯撒实例
原文: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
txt = input("请输入文本:")
for p in txt:
if 'a' <= p <= 'z':
print(chr(ord('a')+(ord(p)-ord('a')+3)%26),end="")
elif 'A' <= p <= 'Z' :
print(chr(ord('A')+(ord(p)-ord('A')+3)%26),end="")
else:
print(p,end="")
四.程序控制
1.if类
if<something>:
<Something>
elif<条件二>:
<something>
else:
<something>
<成立的话> if <条件> else <不成立的话>#表达式(99+1)而不是语句(a=99+1)
Token = “” if s%3 == 0 and s % 5 == 0 else “不”
条件为正常的表达式(and or ())
2.for类
for<循环变量> in <遍历结构>:
遍历结构可以为字符串、文件、range()函数、组合数据类型等
for c in ‘Python’:
for i in range(5): #range后面加循环的次数,但是i的数值范围为[0,4]
for s in ‘PY’:
print(“循环在执行中:”+s)#当然也可以用,s
else:
print(“循环正常结束”)
3.while类
while n<10:
print(n)
n += 3
S, idx = “PY”,0
while idx<len(S):
print(“循环在执行中:”+S[idx])
idx += 1
else:
print(“循环已结束”)
break 和 continue的用法一样
4.异常处理
>>>n = eval(input(“请输入一个数字:”)
请输入一个数字:Python
NameError:name ‘Python’ is not defined
因此有异常处理(处理输入异常)
try:
n = eval(input(“请输入一个数字:”))
print(“输入数字的3次方值为:”,n**3)
expect:
print(“输入错误,请输入数字!”)
>>>for i in range(5):
print(10/i, end=” ”)
ZeroDivisionError:division by zero
可以用异常处理来处理中间的异常
try:
for i in range(5):
print(10/i, end” “)
except:
print(“因某种原因错了!”)
滥用try-expect的后果:影响代码的可读性,增加代码维护难度
True=非0值,非空数据集
5.猜数字游戏
产生随机数
利用random库
Target = random.randint(1,1000)
代码为:
import random
target = random.randint(1,1000)
while True:
guess = eval(input("请输入一个0-1000的整数:"))
if guess>target:
print("猜大了")
elif guess<target:
print("猜小了")
else:
print("猜对了")
break
五.函数与代码复用
1.函数的定义
def fact(n):
s = 1
for i in range(1,n+1):
s *= i
return s
#def 函数名(参数列表):
......
return (返回值列表)
之后在主函数可以直接进行调用
print(fact(100))
2.函数的参数传递
>>>def multiply( x , y = 10):
print( x * y)
>>>multiply(99)
990
>>>multiply( y=2,x=99)
198#参数间的顺序可以任意调整,只要对每个必要参数赋予实际值即可
3.return
return x*y#return后面可以加表达式
>>>def multiply (x,y=10)
return x*y , x+y
>>>s = multiply(99,2)
>>>print(s)
(198 , 101)
>>>a , b = multiply(99,2)
>>>print(a)
198
当然也可以不用return,可以直接进行print的输出
4.作用域
>>>def multiply (x=99, y=2)
z= x*y
return z
>>>s = multiply(99,2)
>>>print(z)
NameError#z是一个局部变量
全局变量:
>>>n=2
>>>def multiply(x,y=10)
global n#global<全局变量>
return x*y*n
六.组合数据类型
1.集合set
元素不可重复,主要用于元素的去重
元素类型不可变数据类型(整数、浮点、字符串、元组不可变列表、字典、集合可变)
无序
>>>T={1010,”1010”,12.3,1010,1010}
>>>print(T)
{1010,’1010’,12.3}#输入不受限制,输出自动去重
- T S内但不在T内
S&T 同时属于S和T
S^T S和T内不是共同拥有的元素
S|T S和T内的所有元素
S.add(x) 如果没有x则将x增加到S中
S.remove(x) 如果x在S中移除该元素,如果x不在S中会出现KeyError异常
S.clear()移除所有项
len(S)元素几个
X in S 如果X是S的元素,返回True 否则返回False
X not in S 同理
>>>S = set()#空集合
>>>S = set(‘知之为知之不知为不知’)
>>>S
{‘不’,’为’,’之’,’知’}#自动去重
2.字符串
S.index(x) 序列s中第一次出现x的位置
S.count(x) 数x的个数
S[i:j:k]从i到j的步长为k
3.列表
不需要预定长度,元素可以重复
>>>ls=[1010,’1010’,[1010,’1010’],1010]
>>>ls[-2]
[1010,’1010’]
>>>ls[0]
1010
>>>ls[5]
IndexError
>>>len(s)#有多少嘞
>>>min(ls)
>>>max(ls)
>>>list(ls)#把ls转变为列表类型,ls可以是字符串、字段、集合等
Ls.append(x)在列表最后增加一个元素x(只能增加一个元素,如果想要增加多个元素,可以使用+进行列表的合并)
Ls.insert(i,x)在列表ls的第i个位置加上x,i之后的序号依次增加
Ls.clear()删除ls中的所有元素
Ls.pop(i)将列表ls中第i项元素取出,并从ls中删除
>>>It = [“1010”,”10.10”,”Python”]
>>>print(It.pop(1))
10.10
>>>print(It)
[“1010”,”Python”]
Is.remove(x)将列表中出现的第一个x删除
当然,也可以用python保留字段进行删除
>>>It = [“1010”,”10.10”,”Python”]
>>>del It[1]
>>>print(It)
[‘1010’,’Python’]
>>>It = [“1010”,”10.10”,”Python”]
>>>del It[1:]
>>>print(It)
[‘1010’]
>>>It = [‘1010’,’10.10’,’Python’,1010,1111]
>>>del It[1:5:2]#[首:尾:步长]
[‘10.10’,1010]
Ls.reverse()ls中的元素进行反转(由此也可见,列表是有顺序的)
Ls.copy()生成新列表,复制ls中的所有元素(如果是Lt=Ls,那么如果对Lt实行的操作,Ls会自动同步)
>>>It = [“1010”,”10.10”,”Python”]
>>>It[1:2] = [1010,10.10,0x1010]
>>>print(It)
[‘1010’,1010,10.1,4112,’Python’]
#不需要It[1:2]与后面的长度相等,遵循“多增少减”的原则
4.字典
{<键一>:<值一>,<键二>:<值二>}
>>>d = {“201801”:”小明”,”201802”:”小红”}
>>>print(d)
{“201801”:”小明”,”201802”:”小红”}
>>>print(d[“201801”])
小明
>>>t = {}#或者也可以换成t = dict()
>>>t[“201801”]=”小红”
>>>print(d)
[“201801”:”小红”]
len(d)字典d的元素个数
min(d)键的最小值
dict(d)生成一个空字典
>>>d = {“201801”:”小明”,”201802”:”小红”,”201803”:”小白”}
>>>d.keys()
dict_keys([‘201801’,’201802’,’201803’])#d.keys()所有键的值
>>>d.values()
dict_valus([“小明”,”小红”,”小白”])#d.values()所有值
>>>d.items()
dict_items([(‘201801’,’小明’),(‘201802’,’小红’),(‘201803’,’小白’)])#d.items()所有键值对
>>>d.get(‘201802’)
‘小红’#查找键对应的值,用get
>>>d.get(“201804”)
>>>d.get(“201804”,”不存在”)
‘不存在’#如果找不到,可以输出后面的那个,如果后面没有写那就默认为空,即没有输出
>>>d.pop(‘201802’)
‘小红’
>>>print(d)
{“201801”:”小明”,”201803”:”小白”}
>>>d.pop(“201804”,”不存在”)
‘不存在’
>>>d = {“201801”:”小明”,”201802”:”小红”,”201803”:”小白”}
>>>print(d.popitem())
(‘201803’,’小白’)
>>>print(d)
{“201801”:”小明”,”201802”:”小红”}#随机找出并删除一个键值对
d.clear()全删除
删除某一元素,也可以用del
>>>del d[“201801”]
>>>print(d)
[‘201802’:’小红’,’201803’,’小白’]
可以用in来判断键是否在字典中
>>>”201801” in d
False
>>>”201803” in d
True
>>>d = {“201801”:”小明”,”201802”:”小红”,”201803”:”小白”}
>>>for k in d
print(“字典的键和值分别是:{}和{}”.format(k,d.get(k)))
字典的键和值分别是:201801和小明
字典的键和值分别是:201802和小红
字典的键和值分别是:201803和小白
七.文件和数据格式化(这里主要是一两道选择+判断)
1.文件的使用
文件类型:文本文件(UTF-8编码,如txt),二进制文件(如png、avi等)
如果是二进制方式打开文件,文件将会被解析成字节流
f = open(“a.txt”,”rt”)#rb只读二进制文件,t是文本文件(默认值)
后面加打开模式r→只读--不存在FileNotFoundError
w→覆盖--不存在则创建,存在则完全覆盖
x→创建写模式--若存在FileExistsError
a→追加内容--不存在则创建
+→增加同时读写功能
f.close
>>>PATH = “D:\\”#多加一个\是转义字符
>>>f = open(PATH + “a.txt”,”rt”)#打开文件--将文件与程序中的对象关联起来
>>>print(f.readline())
全国计算机等级考试#字符串输出时不会输出“”
>>>f.close()#不可以不关闭文件
>>>print(f.readline())
ValueError I/O操作错误
>>>f = open(“D:/bar.txt”,”r”)
>>>s = f.read()
>>>print(s)
新年都未有芳华,二月初惊见草芽。
白雪却嫌春色晚,故穿庭树作飞花。
>>>f.seek(0)#将读取指针重置到文件开头
>>>ls = f.readlines()
>>>print(ls)
[‘新年都未有芳华,二月初惊见草芽。\n’,’白雪却嫌春色晚,故穿庭树作飞花。\n’]#以列表的形式
>>>f.close()
遍历行:
f = open(‘D:/bar.txt’,”r”)
for line in f:
print(line)#逐行遍历文本
f.close()
新年都未有芳华,二月初惊见草芽。
白雪却嫌春色晚,故穿庭树作飞花。
用w写入的方式:
Way1:f.write(“”)直接写入
Way2:f.writelines(ls)#ls为一个列表,但是列表的各个元素之间要写入转义字符隔开,不然就是一行没有空格的字符串
2.数据组织的维度
A.一维线性:空格分隔、逗号分隔、换行分隔、分号分隔等
B.二维成表:CSV(也可用于高维数据的储存)
基本的代码为:
for row in ls:
for item in row:
<对第row行第item列元素进行处理>
C.高维json/书的格式
八. random库与time库
在使用之前,要播种种子
1.random()
>>>from random import
>>>seed(10)播下的种子每次生成的随机数一致
1.random() 生成[0.0-1.0)之间的随机小数
randint(a,b) 生成[a,b]之间的整数
uniform(a,b) 生成[a,b]之间的小数
2.time()
>>>import time
>>>time.time()#获取当前时间戳
>>>time.gmtime(now)#获取当前UTC时间
>>>time.localtime(now)#自动转换为北京时间