1.1语言概述
1.1.1运行模式
命令行模式:整个程序一起运行(常用)
交互模式:只能运行一个句子(好处:不用print)
1.1.2变量替换
a="1"
b="2"
c=a
a=b
b=c
print(a, b)
a="1"
b="2"
a,b=b,a
print(a, b)
2.数据表示与操作
2.1变量名(标识符)
大小写不一样:age != Age
由于python是动态语言,故不需要提前定义变量
不可使用关键字:
内置函数名一旦作为标识符,虽然合法但原有函数功能会消失
尝试用英文翻译+下划线命名法:如用户名user_name而不用yong_hu_ming
2.2运算符号
普通运算符号
乘号:*
除号:/ (注意不是" \ ",这是转义符号)
乘方:**
其余运算符号
导入math函数库:
import math
math.函数名()import math print(math.sqrt(3))#输出根号三
运算优先级
() > ** >正负号> */ > +- eg.-2**4=-16
运算顺序:乘方从右到左,其余从左到右
2.3注释
#一行注释
#多行注释1:选中,按 ctrl和/ 省略
# 1
# 2
# 3
#取消多行注释1:选中,按 ctrl和/ 省略
1
2
3
#多行注释2:"""注释"""
"""1
2
3
4"""
2.4数据类型
求数据类型:type()
a="123"
print(type(a))#输出a的数据类型
数据类型转换
eval(“表达式”)=表达式
如x,y=eval("3","4")则x=3,y=4
可变类型:字典、列表、集合(其余为不可变)
序列:列表、字符串、元组
*改变序列,相当于改变背后的对象
序列的方法
2.4.1字符串str
a="abcde"
b='cdefg'
字符串不可变
s='hello'
s[0]='k'#会报错
求字符串长度:len()
任何符号(包括空格)都算一个长度;一个完整的转义符(如\n)只算一个长度。
a="abc"
print(len(a))#求字符串a长度
索引字符串字符
a="abcde"
print(a[0],a[4])#输出字符串a第1、5个字符
字符串运算符
+ 连接两个字符串
* 复制一个字符串并形成一个新的字符串
常用方法
s='abcdef'
s.upper()#将字符串s中所有字母改为大写
s.lower()#将字符串s中所有字母改为小写
s.replace('edf','g')#将字符串s中对应字符改为指定字符
“his age is {}".format(age)
"my name is {1},age is {0}".format(age,name)#序号也是从0开始
a.strip()#去掉字符串a两边的空格
a.rstrip()#去掉字符串a右边的空格
a.lstrip()#去掉字符串a左边的空格
table=str.maketrans(str1,str2)#生成str1和str2中对应元素对应的转换表table
b=a.translate(table)#根据转换表table将a的元素转换为对应的b的元素
a = ['hello','good','boy','wii']#列表a中元素类型必须为字符串才能用join
print(' '.join(a))#hello good boy wii
print(':'.join(a))#hello:good:boy:wii
title = "this is a name"
result = title.find("is", 0, 9)
print(result)#若没有,不会像index一样报错,会输出-1
注意:字符串不可变,方法处理后生成的是一个新对象
格式化
'{0:*>10}'.format(10)#用*填充,共十位,右对齐
字符串连接
print("hello"+" "+"world")
单双引号转义
print("he said "yes"")#错误的
print('he said "yes"')#正确的
换行:\n
print("hello\nworld")
print(r"hello\nworld")#=print("hello\\nworld"),让转义字符照样输出,不生效
三引号跨行字符串
print("""hello
world""")
2.4.2列表list
shopping_list=["键盘","键帽"]#将“键盘”“键帽”两个加入列表shopping_list
shopping_list.append("显示器")#将“显示器”加入列表shopping_list的末尾
shopping_list.remove("显示器")#将“显示器”移除列表shopping_list
len(shopping_list)#求列表shopping_list长度(即元素数量)
注意:用变量名.方法(...)如append、remove等的时候已经改变了原来的列表,故不需要重新对原列表赋值
列表中元素索引与字符串相同
创建列表
a=list('hello')#a=['h','e','l','l','o']
b=list(range(1,10,2))#b=[1,3,5,7,9]
二维列表
列表元素种类
a=[[1,2,3],[4,5,6],[5,6,7]]#创建【1 2 3|4,5,6|7,8,9】的矩阵
b=a[0][0]#访问列表第一行第一个元素
列表操作
a[1]=2#将第一个元素修改为2
name=list('perl')
name[2:]=list('ab')#将列表name里第三个及以后元素改变为ab
list=['11','22','33','44']
del list[2]#删除列表list中第三个元素
列表的方法
常用函数
list=[3,5,2,-1,4]
print(max(list))#打印列表里的最大值
print(min(list))#打印列表里的最小值
print(sorted(list))#打印从小到大排序好的列表
2.4.3字典
创建
fac={}或fac=dict()
fac=dict([("math","1"),("english","2")]
fac=dict(math="11",english="22")
格式
dictionary={键1:值1,键2:值2,键3:值3}
contacts={("张伟",23):"15000000",
("张伟",34):"15000001",
("张伟",56):"15000002",}
zhangwei23_phone=contracts[("张伟",23)]
键必须是不可变数据类型,即不可以用列表→所以用元组,如tuple=("元素1","元素2")
contracts["美女A"]="13660401028"#往字典contracts中添加或覆盖(原来已有)美女A的值
print("小明" in contracts)#如果为True则字典contracts中有"小明"这个键,False反之
del contracts["小明"]#删除字典contracts中小明键和对应的值
len(contracts)#求字典contracts中有几个键值对
方法
print(score["张三"])#若不存在会报错
score.get("张三")#访问键“张三”对应的值,若不存在会返回None
score.get("张三",k)#访问键“张三”对应的值,若不存在会返回k
score.key()#返回字典score内所有键
score.values()#返回字典score内所有值
score.items()#返回字典score内所有键和值
改变项
常用操作
len()
比较是否相同:==或!=
合并字典1、字典2:{**dict1,**dict2}(如键有重复,2覆盖1)
排序
①先转化为列表
b=list(d.items())
②
按照键排序:b.sort(key=lambda x:x[0])#若用此法,①不可省
或 d=dict(sorted(d.items(),key=lambda x:x[0])
按照值排序:b.sort(key=lambda x:x[1])
或 d=dict(sorted(d.items(),key=lambda x:x[1])
2.4.4数字类型
布尔:True和Fulse(=0)
关系运算符:== != >=等等
字符串间可比较大小:依次比较字符编号(但字符串不能与数字比)
逻辑运算符:not > and > or
一般=True可省略,即:i%3 等价于i%3==1, not i%3等价于i%3==0
空值:None
a=None#a为空值,里面什么都没有
整数int
进制形式
二进制0b
八进制0o
十六进制0x,如0x10=16
进制转换
10-2 bin()
10-8 oct()
10-16 hex()……………hex(16)="0x10"
复数complex:虚部用j表示,如1+3j,2j…(j大小写均可)
浮点数float
“/”为浮点数除法,结果为浮点数。如10/2=5.0
运算一方为浮点数,结果就是浮点数
浮点数运算有误差:用decimal函数
a=decimal.Decimal("2.1")
math库
2.4.5元组
特点:不可变,可作为字典的键和集合的元素(而列表不可以)
turple=(1,7,3,3)
a=turple.count("3")#计算3出现的次数
b=turple.index("7")#计算7下标
2.4.6集合
创建集合
fruit={apple,orange,pear,grape}#直接赋值,如果遇到相同项会直接删去
empty_set=set()#创建空集合
#empty_set={}则创建空字典
prime=set([1,2,3,1,a])#将列表转换为集合
操作
添加元素:add()
删除元素:discard()删除某个元素,若不存在不会报错
remove()删除某个元素,若不存在会报错
clear()删除所有元素剩下空集合
其他:sum(),len(),in,not in,max(),min()
方法
s1.issubset(s2) s1是否是s2的子集
s1.isupperset(s2) s1是否是s2的超集
运算
保留原顺序并去重
生成幂集
2.5输入
input():默认输入字符串(“()”为函数标志,括号内为参数)
如何输入提示语:input("提示语")
一行如何输入多个值:m,n=input().split()
split函数本质上是将输入的东西通过括号内的东西进行切分。
转换字符类型
int("123")#将字符串“123”转换为整数123 float("123")#将字符串“123”转换为浮点数123
#例子
age=int(input("请输入您的年龄:"))
print("您十年后会是"+str(age+10)+"岁")
2.6输出
如何设置多个输出值之间的分隔(默认为空格):print(a,b,c,sep=",")
如何设置输出的结束符(默认为换行\n:print(a,end="")
输出格式控制
print(f"我的名字是{name},身高是{height:.1f}")
print("my name is {:},height is{:}".format(name,height)")
2.7函数
2.7.1内置函数
内置转换函数
将其他进制转化为十进制:int('10101011',2) #将二进制数 10101011转化为十进制
匿名函数lambda
# 匿名函数lambda:用一行定义函数
f1=lambda x:2*x+5#即f(x)=2x+5
f2=lambda a,b:a+b#即f(a,b)=a+b
排序函数sorted
# 排序函数sorted(序列,比较的元素,升/降序)
a={'a':4,'b':3,'c':2,'d':1}
b=sorted(a.items(),key=lambda s:s[1],reverse=False)#默认升序False
print(dict(b))
#输出{'d': 1, 'c': 2, 'b': 3, 'a': 4}
map函数
# map(功能,序列1,序列2……)
b=list(map(lambda x:x*2+1,[1,3,5,7]))
print(b)
#输出[3, 7, 11, 15]
c=list(map(lambda a,b:a*2+b*3,[1,3,5,7],[2,4,6,8]))
print(c)
#输出[8, 18, 28, 38]
zip函数
# 元组打包函数zip(对象1,对象2,……)
a=[1,2,3]
b=[5,6,7]
c=[7,8,9]#记得分行哈~
print(list(zip(a,b,c)))
#输出[(1, 5, 7), (2, 6, 8), (3, 7, 9)]
#可用于重构字典
d={'a':1,'b':2,'c':3}
D=dict(zip(d.values(),d.keys()))
print(D)
#输出{1: 'a', 2: 'b', 3: 'c'}
eval和exec函数
# eval:运行“数学表达式”
eval("1+2+3")
# exec:运行“python程序”
exec("print('good')")#两个引号不能一样
all和any函数
# all([元素1,元素2……]):参数都是True时才返回True
print(all([1,1,3,0]))
# any([元素1,元素2……]):参数有一个True时就返回True
print(any([1,1,3,0]))
#备注:True==1,False==0
2.7.2模块导入(import)
import module_name
→module_name.f()
from module_name import function1,function2
→function1(),function2()
from module_name import*
→function3(),function4()
import module_name as mn
→mn.f()
2.7.3特殊函数
2.7.3.1随机函数
2.7.4参数
位置参数
def position(a,b):
print(b,a)
return
position(7,787)
#输出787 7
关键字参数
def key(a,b):
print(b,a)
return
key(b=7,a=898)
#输出7 898
默认值参数
def moren(a,b=10086):
print(b,a)
return
moren(7)#未提供参数值时,输出指定默认值
moren(8,9)#提供参数值时,调用时替代默认值
#输出10086 7和9 8
不定长参数
def buding1(a,*b):
print(a,b)
return
buding1(1,2,3,4,5,6,7)#一个星号会接受一个元组类型
def buding2(a,**b):
print(a,b)
return
buding2(1,x=1,y=2,z=3)#两个星号会接受一个字典类型
备注:如何才能输入后输出1 (2, 3, 4)?
def a(x,*y): print(x,y) s=list(map(int,input().split()))#输入1 2 3 4 a(*s)
2.7.5变量
3流程控制
分支结构
条件语句if
单分支:if...
双分支:if...else...
多分支:if...elif...else
#比较某个数与60的大小
num=int(input("请输入一个数字:"))
if num > 60:
print(str(num)+"比60大")
elif num < 60:
print(str(num) + "比60小")
else:
print("你输入的是60")
嵌套条件语句
有时候可以用逻辑符号and or not 来简化条件语句
条件语句while
注意:循环内必须有i=i+1否则会死循环
特殊语句
break语句:跳出所在的(最近的一个)循环
*若由break跳出,则不执行else的语句块2;若循环正常结束,由else,则执行语句块2
continue语句:跳过本次循环
4文件
4.1文件的打开与关闭
打开文件:open(filename,mode)
filename可以是文件的实际名字,也可以是包含完整路径的名字
infile=open('d:\python\test.txt','r')#错误的
infile=open(r'd:\python\test.txt','r')
infile=open('d:\\python\\test.txt','r')
infile=open('d:/python/test.txt','r')
或者: ,这种方式不用close
关闭文件:file.close()
4.2文件读取和写入
文件读取
文件写入
文件的标准输入和输出(就是直接定向输入输出的位置,不用说别的)
import sys
# 重定向标准输入到文件
sys.stdin = open("input.txt", "r")
# 重定向标准输出到另一个文件
sys.stdout = open("output.txt", "w")
#后续操作
# 后续直接用sys.stdin和sys.stdout作索引
# while True:
# line = sys.stdin.readline()
# if not line:
# break
# sys.stdout.write(line)
# # 关闭文件
# sys.stdin.close()
# sys.stdout.close()
4.3文件操作(例题示范)
1文件复制
前;
后
a=open("C:\\Users\\蔡予\\OneDrive\\桌面\\cj.txt",'r')
b=open("C:\\Users\\蔡予\\OneDrive\\桌面\\cjback.txt",'w')
c=a.read()
b.write(c)
a.close();b.close()
2文件合并
把file1.txt和file2.txt文本文件的每一行交替合并到file.tex中,最后把行数较多的剩余内容全部写道file.tex中。
前:后:
f1=open("C:\\Users\\蔡予\\OneDrive\\桌面\\file1.txt",'r')
f2=open("C:\\Users\\蔡予\\OneDrive\\桌面\\file2.txt",'r')
f=open("C:\\Users\\蔡予\\OneDrive\\桌面\\file.txt",'w')
# print(f1.readlines())
# print(f2.readlines())#先试试看看输入成不成功、细节上有没有出问题
flag=1
while True:
line1=f1.readline()
if line1:#line1!=0即line1存在
f.writelines(line1)
else:
flag=1
break
line2 = f2.readline()
if line2:
f.writelines(line2)
else:
flag=2
break
if flag==1:
f.writelines(f2.readlines())#lines和line不一样哦~
else:
f.writelines(f1.readlines())
f1.close();f2.close();f.close();
3计算平均分
文件score.txt是学生一学期的成绩,计算总评成绩(笔试*50%+平时25%+实验*25%)并按照以下格式输出
文件:输出:
#读入多行文本
f=open("C:\\Users\\蔡予\\OneDrive\\桌面\\score.txt",'r',encoding='UTF-8')
s=f.readlines()
#输出头部信息
l0=s[0].split()
print("{:<4s}{:<3s}{:<3s}{:<3s}{:<3s}{:5s}".format(l0[0],l0[1],l0[2],l0[3],l0[4],"平均分"))
#计算平均分
for line in s:
l=line.split()
if l[2].isdigit() and l[3].isdigit() and l[4].isdigit():
s=round(int(l[2])*0.5+int(l[3])*0.25+int(l[4])*0.25,2)
#按格式输出
if l[2].isdigit() and l[3].isdigit() and l[4].isdigit():
print("{:4s}{:^4s}{:^5s}{:^5s}{:^5s}{:.2f}".format(l[0],l[1],l[2],l[3],l[4],s))
#不要忘了关闭文件
f.close()
异常处理
try:
正常的操作
except:
如果报错的操作
典型问题
排序问题
1)选择法:选择最大/小的放到最前面
list=[30,81,31,65,87]
for i in range(len(list)-1):
idx=i
for j in range(i,len(list)):
if list[j]>list[idx]:
idx=j
list[idx],list[i]=list[i],list[idx]
print(list)
2)冒泡法:相邻比较,把大/小放后面
list=[30,81,31,65,87]
for i in range(len(list)-1):
for j in range(len(list)-1,i,-1):
if list[j-1]<list[j]:
list[j],list[j-1]=list[j-1],list[j]
print(list)
搜索问题
二分法
统计计数问题
提取特殊种类信息(如数字)
数列求和(积)
1)for循环:项数已知
2)while循环:精确度等限制条件已知
最好用递推公式算,不仅可以避免阶乘,还可以大大减少计算量(若用阶乘,因为10^6的阶乘太大运算不了)。
图形
循环结构
打印n阶杨辉三角
n=int(input()) a=[0]*n#占好n行 for i in range(n): a[i]=[1]*(i+1)#有数字的地方全拿1填充 for i in range(2,n):#从第三行开始处理 for j in range(1,i):#只处理非1位 a[i][j]=a[i-1][j-1]+a[i-1][j] print(a)
穷举求解
数论类
1)公约数、公倍数
2)斐波那契数列