python学习——复习
一、基础知识:
1、文件操作有哪些模式?请简述各模式的作用。
'r' 读模式,相应的方法有 read(),readline(),readlines() 'w' 写模式,相应的方法有 write(),writelines() 'a' 追加模式 'rb' 以字节码的形式读 'wb' 以字节码的形式写 'ab' 以字节码的形式追加 'r+','w+','a+' 可读可写
2、s = ' **hello world!** ',请去除字符串两边的空格和*。
s = ' **hello world!** ' s = s.strip() s = s.strip('*') print(s) # 输出:hello world!
3、用户输入任意数字,求1-n之间所有的奇数。
num = eval(input('请输入一个大于1的整数:')) if not type(num) == int: print('输入错误,您必须输入一个整数!') elif num <= 1: print('输入错误,您输入的数必须大于1!') else: for i in range(1,num,2): print(i,end=' ')
4、s = 'hskakhlkshfkskjakf',请去除s字符串中重复的字母
lst = [] s = 'hskakhlkshfkskjakf' for str_s in s: if str_s not in lst: lst.append(str_s) print(lst) # 输出:['h', 's', 'k', 'a', 'l', 'f', 'j']
5、有以下代码:
a = 10 b = 20 def test(a,b): print(a,b) c = test(b,a) print(c) #上述代码中,打印出来的值a,b,c分别是什么,为什么?
答:a = 20 b = 10 c = None 因为c是调用 test()函数,而 test()函数没有返回值则默认返回 None
6、s = '123.33sdhf3424.34fsjlg323.325',计算字符串中所有数字之和? 本题的结果应该为:123.33 + 3424.34 + 323.32
import re ret = re.findall(r'\d+\.\d{2}','123.33sdhf3424.34fsjlg323.325') res = sum([float(i) for i in ret]) print(res) # 输出:3870.9900000000002
7、👇
7、d = {'k1':'v1','k2':[1,2,3],('k','3'):{1,2,3}}
请用程序实现:
1)输出上述字典中value为列表的key
2)如果字典中的key是一个元组,请输出对应的value值
3)d[('k','3')]对应的value是一个什么数据类型
d = {'k1':'v1','k2':[1,2,3],('k','3'):{1,2,3}}
for dct in d:
if type(d[dct]) == list:
print(dct)
for dct in d:
if type(dct) == tuple:
print(d[dct])
print(type(d[('k','3')]))
# 输出:
k2
{1, 2, 3}
<class 'set'>
8、如果不使用@wrapper装饰器,请在a()之前加入一句代码,达到相同的效果 👇
def wrapper(func): def inner(*args,**kwargs): func(*args,**kwargs) return inner @wrapper def a(arg): print(arg) a()

9、请处理文件 question_file,输出所有以‘T’开头的行
with open('question_file.txt','r') as f1,open('question.txt','w') as f2: for i in f1.readlines(): if i.startswith('T'): f2.write(i)
首先以读的方式打开一个文件作为f1(此文件必须存在,否则会报错),然后再以写的方式打开一个文件作为f2(此文件可以不存在,不存在就会新建一个),最后把从f1中读出来的字符串进行判断之后再写入f2文件。
10、读登陆文件夹中的代码,请为这段代码画流程图

11、默写10个字符串对象的内置方法,描述它的作用
1.startswith() 字符串以什么开头 2.endswith() 字符串以什么结尾 3.split() 以某个‘任意对象’分割字符串 返回一个列表 4.join() 以某个‘任意对象’分隔字符串 返回一个字符串 5.replace() 把字符串中某个对象替换成某个字符 6.find() 对字符串进行查找,找到就返回该字符在字符串中第一个位置的下标(只找第一个),没找到就返回-1 7.format() 格式化字符串用 8.strip() 去除字符串两端的空白字符,还可以去除字符串两端指定的字符 当然还有rstrip()和lstrip() 9.swapcase() 把字符'串中的大写变小写,小写变大写 10.isupper()和upper() islower()和lower() isspace() isdigit() istitle()和title() isalpha() isalnum() 用法看英文就知道意思了。。。 11.count() 对字符串中的字符进行计数,有就返回多少个,没有就返回0 12.capitalize() 把字符串的首字母变大写 13.index() 返回字符的下标,没有就报错 14.zfill() 返回指定数字个字符,如果字符不够,前面以0填充 15.partition()和rpartition() 也是分割,以某个对象分割字符串,但永远只能把字符串分割成3个部分,rpartition()从右边开始。 16.decode()和encode() 对字符串进行解码和编码。
12、有以下代码,画出调用的顺序及结果
def f1(): print('funcname is f1') def f2(): print('funcname is f2') return 1 def f3(func1): l1 = func1() print('funcname is f2') return l1 print(f3(f2))

13、创建一个闭包函数需要满足哪几点?
答:只要是闭包函数就一定是两个函数之间的事,即内部函数引用外部变量,但变量不包括全局变量。
14、将时间打印出一个2018/12/11 19:41:20的格式 再将‘2018-12-11 19:41:56’转换为结构化时间
import time print(time.ctime()) print(time.strptime("2018-12-11","%Y-%m-%d"))
15、用什么模块能知道文件夹存不存在?怎么获取这个文件夹的大小?
import os print(os.path.exists('python复习.py')) print(os.path.getsize('python复习.py'))
16、请写出一个能够匹配手机号码的正则表达式。
import re s= '08509810555and15085389056and18708507836and13984741074and15121483592and23585859868' res = re.findall(r'1[3456789]\d{9}',s) print(res)
17、有四个数字:1,2,3,4,能组成多少个互不相同且无重复的三位数数字?分别是多少?请编程实现。
for i in range(1,5): for j in range(1,5): if i == j: continue for k in range(1,5): if j == k or i == k: continue print(str(i)+str(j)+str(k),end=' ') # 输出:123 124 132 134 142 143 213 214 231 234 241 243 312 314 321 324 341 342 412 413 421 423 431 432
这道题实现的方式很多,主要是看用什么方式实现的时间复杂度和空间复杂度的大小及运行时间的优化。
二、面向对象:
1、请简述类,对象,实例化,实例这些名词的含义
答:类(Class)是面向对象程序设计(OOP,Object-Oriented Programming) 实现信息封装的基础。类是一种用户定义类型,也称类类型。每个类包含数据说明和一组操作数据或传递消息的函数。
对象:通过类实例化得到的就是对象,也叫类的实例。
实例化:调用类的过程就叫实例化。
2、面向对象的三大特性是什么?
封装,多态,继承
3、什么是方法?类中可以定义哪几种方法?
答:在类中的函数就是方法 ,描述一类事物的行为。类方法包括 静态方法 伪私有方法 内置方法 ,属性方法(@property)
4、什么是属性?类中可以定义哪几种属性?
答:类和对象所拥有的具体的‘值’指标就是属性,类中的属性包括数据属性和方法属性,而数据属性一般是静态属性 ,方法属性一般为动态属性。当然不管是数据还是方法属性都可以设置成
私有的(伪私有)👈 且包括方法中定义的属性也可以。
5、请简述类方法和静态方法有哪些区别?
答:装饰器不同 一个是@staticmethod 一个是@classmethod 类方法的参数列表中第一个默认参数是cls, 而静态方法和普通函数一样,可以不用传参数。
6、请简述新式类和经典类的区别?
答:经典类 遵循深度优先算法并且没有mro方法 ,用在python2.x中,但python2.x中也有新式类;
新式类 遵循广度优先算法,有 mor方法 用在python3中。
mro方法:查看继承时的继承顺序。
7、又一个类定义如下:
class Person: def __init__(self,name,age): self.name = name self.age = age
1) 初始化10个不同的对象
2)求最高age的对象的name
lst = [] for i in range(10): lst.append(Person('name'+str(i),20+i)) max_age_person = max(lst,key = lambda x : x.age) print(max_age_person.name) # 输出:name9
import random lst = [] for i in range(10): lst.append(Person('name'+str(i),random.randint(1,100))) for o in lst: print(o.name,o.age,sep=':') max_age_person = max(lst,key = lambda x : x.age) print(max_age_person.name)
8、👇
8、模拟cs有些 1)人物角色分为警察和匪徒两种,定义成两个类。 所有警察的角色都是police 每个警察都有自己独有名字,生命值,武器,性别 每个都可以开枪攻击别人,且攻击目标不能是police 所有匪徒的角色都是terrorist 每个匪徒都有自己独有名字,生命值,武器,性别 每个都可以开枪攻击别人,且攻击目标不能是terrorist 2)实例化一个警察,一个匪徒,警察攻击匪徒,匪徒掉血。 3)提取警察类和匪徒类相似之处定义成一个父类,使用继承的方式来减少代码重复。
class Police: def __init__(self,name,sex,life_value,weapon): self.name = name self.sex = sex self.life_value = life_value self.weapon = weapon def attack(self,obj): if isinstance(obj,Terrorist): obj.life_value -= self.weapon class Terrorist: def __init__(self,name,sex,life_value,weapon): self.name = name self.sex = sex self.life_value = life_value self.weapon = weapon def fight(self,obj): if isinstance(obj,Police): obj.life_value -= self.weapon p1 = Police('警察1','男',100,20) t1 = Terrorist('匪徒1','男',90,10) p1.attack(t1) print('{0}攻击了{1}一次,{1}的生命值还剩下{2}'.format(p1.name,t1.name,t1.life_value)) # 输出结果:警察1攻击了匪徒1一次,匪徒1的生命值还剩下70
class Person: def __init__(self,name,sex,life_value,weapon): self.name = name self.sex = sex self.life_value = life_value self.weapon = weapon class Police(Person): def attack(self,obj): if isinstance(obj,Terrorist): obj.life_value -= self.weapon class Terrorist(Person): def fight(self,obj): if isinstance(obj,Police): obj.life_value -= self.weapon p2 = Police('警察2', '男', 100, 20) t2 = Terrorist('匪徒2', '男', 100, 10) p2.attack(t2) t2.fight(p2) print('{0}攻击了{1}一次,{1}的生命值还剩下{2}'.format(p2.name, t2.name, t2.life_value)) print('{0}攻击了{1}一次,{1}的生命值还剩下{2}'.format(t2.name, p2.name, p2.life_value)) # 输出结果: 警察2攻击了匪徒2一次,匪徒2的生命值还剩下80 匪徒2攻击了警察2一次,警察2的生命值还剩下90
9、读代码:👇
class Base: def f1(self): self.f2() def f2(self): print('*********') class Foo(Base): def f2(self): print('##########') obj = Foo() obj.f1()
问题1:面向对象中self指的是什么?
答:self就是实例或者说类实例化而得到的对象
问题2:运行结果是什么并简述原因。
运行结果:‘##########’ 原因就是 Foo这个类里面并没有f1,但是它继承了 Base类,在自己的类中没有 找到f1就到父类中去找,找到了,但是执行f1相当于执行 f2,
而 Foo类中有自己的 f2,所以就执行自己的 所以打印了'##########'
三、附加题:
有一个类的init方法如下:
class Person: def __init__(self,name,age,sex,weight): self.name = name self.age = age self.sex = sex self.weight = weight 假设有100个Person的对象,若两个对象obj1,obj2的name和sex属性相同, 即obj1.name = obj2.name and obj1.sex = obj2.sex 我们认为两个对象为同一个对象,已知一个列表中的100个对象,对这100个对象进行去重。 提示:重写Person类中的两个‘双下方法’
class Person: def __init__(self,name,sex,age): self.name = name self.age = age self.sex = sex def __hash__(self): return hash(self.name + self.sex) def __eq__(self, other): if self.name == other.name and self.sex == other.sex: return True p_lst = [] for i in range(100): p_lst.append(Person('刘龙海','男',i)) print(p_lst[:2]) print(set(p_lst)) # # 输出: # [<__main__.Person object at 0x0000023940FF5B38>, <__main__.Person object at 0x0000023940FF5C88>] # {<__main__.Person object at 0x0000023940FF5B38>}
此题去重的背景是“假如某个公司存有员工的信息,随着时间的增加,每个人的信息只有年龄在逐渐增加,而其他信息并没有改变,为了信息不重复,只把年龄修改了,所以才会对此信息去重”我的理解就是这样。
浙公网安备 33010602011771号