Python 3期末复习

常见问题总结

字符串操作

字符串的翻转

如:s1=“dkvkwd”,实现字符串的翻转并输出。

s1="dkvkwd"
#第一种方式,通过对字符串的切片
print(s1[-1::-1]) #dwkvkd
#第二种方式,将字符串放进列表中。利用reverse方法翻转,并用join方法拼接
l=list(s1)
l.reverse()
s2=''.join(l)
print(s2) #dwkvkd

字符串的大小写转换

如:s1=“Constains drop wears the stone”,将首字母全部转换为大写

s1="Constains drop wears the stone"
l1=list(s1)
s2=''
for i in range(1,30):
    if(l1[i-1]==' '):
        l1[i]=l1[i].upper(); #调用upper()将小写字母转为大写
s2=''.join(l1) #拼接
print(s2) #Constains Drop Wears The Stone

拓:s1=“eJHJB12er3befe9s23d”,去掉字符串中的数字,并将其中的大小写字母相互转换

s1="eJHJB12er3befe9s23d"
l2=list(s1)
s3=''
for i in range(len(l2)):
    if(l2[i]>='0'and l2[i]<='9'):
        l2[i]=''
    elif(l2[i]>='a'and l2[i]<='z'):
        l2[i]=l2[i].upper() #调用upper()将小写字母转为大写
    elif(l2[i]>='A'and l2[i]<='Z'):
        l2[i]=l2[i].lower() #调用lower()将小写字母转为大写
s2=''.join(l2)
print(s2) #EjhjbERBEFESD

统计字符串中字母出现的次数

如:s1=“JKjfdisasc3kfmKNKSsce”,统计s1中每个字母出现的次数(忽略大小写),并以字典的形式输出。

#第一次尝试写的代码(较为复杂)
s1="JKjfdisasc3kfmKNKSsce"
dict={}
l1=list(s1)
s2=''
for i in range(len(l1)):
    if l1[i]>='0'and l1[i]<='9':
        l1[i]=''
    elif l1[i]>='A'and l1[i]<='Z':
        l1[i]=l1[i].lower()
for i in range(len(l1)):
    if l1[i]=='':
        continue
    if l1[i] in dict:
        dict[l1[i]]+=1;
    else:
        dict[l1[i]]=1;
print(dict) 
#{'j': 2, 'k': 4, 'f': 2, 'd': 1, 'i': 1, 's': 4, 'a': 1, 'c': 2, 'm': 1, 'n': 1, 'e': 1}
#改进代码
s1="JKjfdisasc3kfmKNKSsce"
dict={}
l1=list(i for i in s1 if i.isalpha()) #列表解析语句,将字符串中满足条件的字符放入列表中,这里调用字符串的isalpha()方法将字符串中的字母放入列表中
for i in l1:
    i=i.lower() #为了实现不区分大小写,我们将字母统一为小写
    if i in dict:
        dict[i]+=1 #列表中已有此key值
    else:
        dict[i]=1 #列表中没有此key值,初始化value值为1
print(dict)
#{'j': 2, 'k': 4, 'f': 2, 'd': 1, 'i': 1, 's': 4, 'a': 1, 'c': 2, 'm': 1, 'n': 1, 'e': 1}

对字符串去重(不区分大小写,即一个字母只要求出现一次)

如:s1=“wdcJNCSjA2W98KJ0cdAKCa”

# 利用set去重
s1="wdcJNCSjA2W98KJ0cdAKCa"
s2=''
s=set([i.lower() for i in s1]) #先列表解析,再将列表转为集合(去重)
s2=''.join(list(s))
print(s2) #ka2jn0cws8d9

上面虽然完成了去重的任务,但如果我们想要保持原有的顺序输出且保留字母第一次的大小写形式,该如何改进呢?

# 改进版(有序输出)
s1="wdcJNCSjA2W98KJ0cdAKCa"
s2=''
l1=list(s1)
for i in range(len(l1)):
    for j in range(i+1,len(l1)):
        if  l1[i].lower()==l1[j] or l1[i].upper()==l1[j]: #不区分大小写,只保留第一次出现的字母
            l1[j]='' #若后边的字母已在前边出现过,则置为空字符串
s2=''.join(l1)
print(s2) #wdcJNSA298K0
# 改进版二
s1="GCHNJfdcs24KJKdvcaVHJ23ws98Csm"
s2=""
for i in range(len(s1)):
    if s1[i].lower() not in s2 and s1[i].upper() not in s2:
        s2+=s1[i]
print(s2) #GCHNJfds24Kva3w98

统计一段英文文本中各个单词出现的次数

如:s1= “How are you.How are you.”

s1= "How are you.How are you."
l1=list(s1)
s2=''
dict={}
for i in range(len(l1)):
    if l1[i]!=' 'and l1[i]!='.':
        s2+=l1[i] #拼接单词
    else: #统计每个单词出现的次数
        if s2 in dict:
            dict[s2]+=1
        else:
            dict[s2]=1
        s2='' #置空,用于下一次的拼接
print(dict) #{'How': 2, 'are': 2, 'you': 2}

字典操作

将一个字典中的key-value值互换

如:dict={“dxy”:“keai”,“ypp”:“meili”,“sisi”:“keai”}

dict={"dxy":"keai","ypp":"meili","sisi":"keai"}
dict2={}
for i in dict.keys():
    dict2[dict[i]]=i
print(dict2) # {'keai': 'sisi', 'meili': 'ypp'}

通过两个列表给字典的key-value赋值

如:city=[‘xian’,‘tianjin’,‘beijing’,‘shanghai’] code=[‘001’,‘002’,‘003’,‘004’]

city=['xian','tianjin','beijing','shanghai']
code=['001','002','003','004']
dict={}
for i in range(len(city)):
    dict[city[i]]=code[i]
print(dict) # {'xian': '001', 'tianjin': '002', 'beijing': '003', 'shanghai': '004'}

未完待续…

数字运算相关

求质数问题

如:求100以内的质数

for i in range(2,101):
    for j in range(2,i):
        if i%j==0:
            break
    else:
        print(i,end=" ") 
# 2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97

删除数字问题

如:有100个瓶子,编号1-100,现在有人拿枪开始射击,从第一号瓶子开始,每枪按顺序击破一个,跳过一个,再击破一个,跳过一个,一直到一轮完成,接着在剩下的瓶子里面再次按顺序击破第一个,间隔一个再击破一个,持续循环,直到最后剩一个瓶子结束。问最后一个完整的瓶子的号码是几号

# 方法一
l1=[]
for i in range(1,101):
    l1.append(i)
while len(l1)>1: #只剩一个瓶子时循环结束
    for i in range(len(l1)) :
        if i%2==0: 
            l1[i]=0 #标记要删除的位置
    for i in l1:
        if i==0:
            l1.remove(i) 
print(l1) # [64]
# 方法二
l1=[]
for i in range(1,101):
    l1.append(i)
while len(l1)>1:
    s=0 #标记位
    for i in l1:
        if s==0: # 标记为0则删除(依题意从第一个开始删)
            l1.remove(i)
            s=1  # 此时列表中的元素前移,置当前位置的标记为1(依题意,间隔一个)
        if s==1: #保留当前位置的元素
            s=0  #因为执行完循环体后,i会移向下一个元素,所以将s置0
            continue
print(l1) # [64]

其他

对名字按字典排序

写一段程序,能够实现如下功能。
① 输入英文的姓名
② 按照字典顺序将所有姓名排序
③ 输入完毕,将排序结果打印出来

list=[]
while 1:
    s=input("请输入英文名:")
    if s==" ": #输入空格停止
        break
    list.append(s)
list.sort() #调用sort即可完成按字典排序
print(list)
input:
请输入英文名:akaka
请输入英文名:akakb
请输入英文名:dsc
请输入英文名:wef
请输入英文名:bra
请输入英文名:zwevw
请输入英文名:assf
请输入英文名:vve
请输入英文名: 
output:
['akaka', 'akakb', 'assf', 'bra', 'dsc', 'vve', 'wef', 'zwevw']

找出两个列表的不同

#思路: 将两个列表中的特有的元素相加
l1=[1,2,12,4,5,7,12,54,15]
l2=[1,8,9,5,13,1,98,36]
s1=list(set(l1)-set(l2)) #找出两个列表特有的元素(且要去重) 用set
s2=list(set(l2)-set(l1)) # set之间可以用-,不可用+
s=s1+s2  #将列表相加 列表之间可以用+,不可以用-
print(s) #[2, 4, 7, 12, 15, 54, 98, 36, 8, 9, 13]

面向对象相关

如:定义一个类,计算矩形的面积

class A:
    __length=0
    __width=0
    def __init__(self,l,w):
        self.__length=l
        self.__width=w
    def getArea(self):
        return self.__length*self.__width
a=A(15,20)
b=a.getArea()
print(b)

如:定义两个类,getString类接收用户输入的字符串,printString类输出字符串的全大写形式

class getString:
    s1=''
    def __init__(self,s1):
        self.s1=s1
    def getStr(self):
        return self.s1
class printString:
    def printStr(self,s2):
        s3=s2.upper()
        print(s3)
a=getString("vdsdvHUVsvs")
b=printString()
b.printStr(a.getStr()) #VDSDVHUVSVS

class getString:
    s1=input("请输入一个字符串:")  #abcsd
    def getStr(self):
        return self.s1
class printString:
    def printStr(self,s2):
        s3=s2.upper()
        print(s3)
a=getString()
b=printString()
b.printStr(a.getStr()) #ABCSD

如:定义两个方法,getString方法接收用户输入的字符串,printString方法输出字符串的全大写形式

class test:
    s=""
    def getString(self):
        self.s=input()
    def printString(self):
        print(self.s.upper())
t=test()
t.getString() #sddvsd
t.printString() #SDDVSD

用双重循环输出方格列表

如:创建一个3*3的方格列表,且要求方格内的数字递增

l1=[]
l2=[]
j=1
for i in range(0,3):
    l1.append(l2) #列表嵌套
    for i in range(0,3):
        l2.append(j) #添加元素
        j+=1
    l2=[]   #清空,存储下一个内层列表的元素    
print(l1) #[[1, 2, 3], [4, 5, 6], [7, 8, 9]]

输出大菱形的右侧图案

for i in range(1,6):
    print()
    for i in range(0,i):
        print("*",end="")
for i in range(1,5):
    print()
    for i in range(0,5-i):
        print("*", end="")
output:
*
**
***
****
*****
****
***
**
*

本文仅用于天津理工大学python期末复习使用,知识点也只限于考试复习。