Toggle navigation
Mr.Strawberry's House
文章
网址导航
更多
甜品站
杂物间
新版博客
关于 快刀切草莓君
友情链接
妙妙屋开发日志
注册
登录
搜索
文章列表
分类 标签
归档
# Python 刷题笔记 本文记录了我在使用 python 做题和编程 的时候遇到的容易出错的知识点。 文章5月25日更新:调整了文章结构;对内容进行了删减 [TOC] ## 语言基础 ### 变量 1. Python3 中,布尔型只有 True 和 False 两个值,但它们的值本质上是 1 和 0,因此它们可以和数字进行数学运算。 **正确** e.g. `True+1 == 2` ### 数字 1. Python的浮点数常量也有十进制、二进制、八进制和十六进制等表示方式 错误,浮点数只有 十进制, 科学计数法 2. type(1+8.0//4) == float 整除的结果取决于被除数和除数的类型 3. 在Python 3.X版本中,整除运算符产生的结果的数据类型可能为浮点型 **正确** e.g. `33.2 // 3 == 11.2` ### 运算符与表达式 1. and or not 的优先级 not > and > or 在`and` 和 `or` 同时出现的时候,短路求值的同时又加入了优先级。 以 A or B and C为例: - 先判断A的逻辑 True则短路求值True - A False 则求 (B and C)的值 - **即 A or (B and C)而非 (A or B) and C** 2. is 和 ==的区别 - 前者比较对象的id - 后者比较 对象的value ### 常用内置函数 BIF 1. pow(x,y,z) -> x**y%z 详见 Python常用标准库文章 ### 其他 1. 如果一句Python代码过长,可在行末写下符号"/",然后换行继续写 **错误 分行是\\或者()** ### 基本输入输出 **`sys.stdin` 与`input`** **`sys.stdout` 与 `print`** 详见 python 标准库文章 ## 内建数据对象 ### 列表 1. 列表对象的复制 非拷贝方法(直接赋值) 拷贝方法(浅拷贝 深拷贝) [文章](https://www.cnblogs.com/Black-rainbow/p/9577029.html) 2. 只能通过切片访问列表中的元素,不能使用切片修改列表中的元素 错误 3. 两个列表相加 `newlist = [x+y, for x,y in zip(list1, list2)]` 4. 现有列表 k = [1, 2, 3, 4, 5, 6, 7, 8, 9, 0],那么Python3解释器执行 k.insert(-2, 'b')后执行k[-2]的结果是 9 b插入在9的位置 9 0 向后移动 5. `+` 和 `+=` : 列表1 = 列表1加列表2 是生成一个新的列表,列表1+=列表2类似 `extend` ### 元组 1. 创建只包含一个元素的元组时,必须在元素后面加一个逗号,例如 a = (3,)正确 如果是a = (3) 或者a = ('a') 类型分别为int和str,只有一个元素的元组一定要加上`,` 2. 列表可以是元组内的元素,可以改变元组内列表的值 3. 表达式(i\*\*2 for i in range(100))的结果是个元组 **错误**! 这是一个生成器 e.g. ``` (i**2 for i in range(10)) > for i in a: ... print(i) 0 1 4 9 16 25 ... ``` ### 字典 1. 合并两个字典 ``` a={'a':1,'b':2} b={'a':3,'c':4} a.update(b) c = dict(a,**b) ``` 2. 字典中的“键”必须是可哈希对象,不能是列表,可以是元组,字符串,数值 3. 字典的键可以是字符串常量也可以是整型常量,甚至还可以是**列表** **错误** 列表不能作为字典的键 ### 集合 1. 集合中的元素必须是不可变类型,即列表不可以是集合内的元素 ## 字符串与正则表达式 ### 字符串 1. 要一次去掉字符串中的 , . 等符号,可以使用`maketrans`和`translate`方法 2. 'GUN\'s Not %s %%' % 'UNIX' >> "GUN's Not UNIX %" 3. 表达式`'a' + 1` 的值为 'b' 错误 chr(ord('a') + 1) 4. 要将3.1415926变成00003.14,如何进行格式化输出 "**%08.2f**"% 3.1415926 ### 正则 1. 假设re模块已成功导入,并且有`pattern = re.compile('^'+'\.'.join([r'\d{1,3}' for i in range(4)]) + '$')`,那么表达式`pattern.match('192.168.1.103')`的值为None 2. `'back'` match 'backup'√ ; match 'text.back' 3. 正则表达式'\d{5}'可用来检查字符串是否为5个数字字符组成的字符串 **错误** 可匹配5个数字的模式 但是一串可能有多个这样的子串? 4. 下面不能严格匹配YYYY-MM-DD这样日期格式的正则表达式是 B ``` A.\d{4}-\d{2}-\d{2} B.[0-9]-[0-9]-[0-9] C.[0-9]{4}-[0-9]{2}-[0-9]{2} D.[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9] ``` ## 选择与循环 1. `a = range(100)` 的合法操作 - `a[-3]` - `a[2:13]` - `a[::3]` 即`a[a : b : c]` 等于 `range(a, b, c)` 2. for循环结束后,循环变量i不存在,导致程序错误 **错误**! i变量会是最后的值 3. 如果递归函数没有递归结束的语句,将会导致无穷递归,从而执行时出现“死循环” **错误** **解释**:递归是不断有函数进入栈,就像翻不完的书,不是死循环。 ## 函数 在函数中修改传入参数的值 - 整数,浮点数等不会因函数内变化而变 - 列表对象在id不变的时候会影响到外部的 1. 输出结果 F f C ls是全局变量 ``` ls = ["F", "f"] def fun(a): ls.append(a) return fun("C") print(ls) ``` 2. 输出结果10 None ss比函数迟声明 函数内的ss为局部变量 ``` def hub(ss, x=2.0, y=2.0): ss += x*y ss = 10 print(ss, hub(ss, 3)) ``` 3. 对于组合数据类型的全局变量,如果在函数内部没有被真实创建的同名变量,则函数内部不可以直接使用并修改全局变量的值 **错误** 类似上述1 的情况 4. Python函数支持可变数量的参数,实参用“ *参数名 ”表示 错误 形参用`*参数名`表示 5. 函数的**可变长度参数** 有什么形式(*arg, *kwarg) - 前者接收任意个实参并放到一个**元组**中 - 后者类似 关键参数 一样显示赋值多个实参 并放入**字典**中 ## 面向对象 1. 函数和方法有什么区别 如何判断一个对象是函数还是方法 https://www.cnblogs.com/xcsg/p/10551114.html - 函数:FunctionType 直接def的是函数 类中的函数 通过类的方式调用 也是函数 `<function Work.show at 0x000001CC55BC5268>` - 方法:MethodType 类中的函数 通过实例化对象调用 为方法 ` <bound method Work.show of <__main__.Work object at 0x000001CC55C2F240>>` - 判别方式 1.直接print会得到上面的描述 2. `isinstance(对象, FunctionType)` `isinstance(对象, MethodType)` ### 继承机制 1. 派生类可以继承父类的公有成员,但不能继承其私有成员。 2. 在派生类中调用基类方法,可以使用`super()`或`基类名.方法名()`的方式进行 ## 文件 1. 如果首先以读模式打开一个文件,然后用seek方法把文件指针定位到文件的最后,再通过tell方法就可以得到一个文件的长度。 ** 正确** 2. 参数encoding是指明对文件编码,仅适用于文本文件。如果不明编码方式,默认是使用locale.getpreferredencoding()函数返回的编码方式。 3. `seek(offset, from)`方法 offset 文件指针偏移量, from: 0 文件开头 1当前位置 2文件末尾 默认为0 可以通过seek(0,2)定位到文件末尾 4. 用python删除文件和用linux命令删除文件 `os.remove(path)` `rm file_path` 5. write方法用于把字符串写入文本文件并在最后添加换行符。 **错误** ## 异常 1. Python中,对于代码中的每个try,必须至少有一个except与它匹配 错误可以只有try finally 2. 异常 输入 a undefined ``` def main(): a,b=eval(input()) try: s=a/b print(s) except: print("Divide 0!") main() ``` ## 其他 ### 常见数学 1. 因数 i%n ==0 且n!=i n!=1 n是i的因数 2. 素数 大于1的自然数中,除了1和它本身以外不再有其他因数的自然数。 3. 完全数 4. 真因子 5. 完全平方数: 2 * 2 = 4 8 * 8 =64 6. 互质:互质是**公约数只有1**的两个整数,叫做互质整数。公约数只有1的两个自然数,叫做互质自然数,后者是前者的特殊情形。 7. 完数 8. 水仙花数 - 对于数字n,如果表达式 0 not in [n%d for d in range(2, n)]的值为True,则说明n是素数 **正确** 列出了所有的 n% 2~n的数字值 如果0不在就说明是素数 欧几里得(辗转相除法)求两个正整数a, b的**最大公约数** 1)如果a<b,交换a,b的值2)r=a mod b(即r是a÷b的余数),若 r = 0,算法结束,b即为答案3)否则,互换:a ← b,b←r,并返回第一步。 快速判断是否是**素数** [文章](https://blog.csdn.net/qq_36963214/article/details/90490364) 代码实现 ``` def is_prime_fast(num): if num <= 1: return False elif num == 2 or num == 3: return True elif num % 6 in (0, 2, 3, 4): return False else: half = int(sqrt(num)) + 1 for i in range(5, half, 6): # 只需判断6i+1 和6i+5是不是num的因子即可 if num % i == 0 or num % (i+2) == 0: return False else: return True ``` ### 未分类 2. 能否举出几个 Python2 和 3不同的地方 - print语法 print "xxx" -> print("xxx") - **2**的字符串是ascii类型 unicode是单独的 **3**中有字符串类(unicode)以及字节类byte和bytearrays 且源码默认utf-8 - 除法运算 **3**中的`/`是真除法 (整数之间的相除,结果也会是浮点数) `//`是整除 **2**的`/`是整除 - 2中有xrange()和range() 前者像生成器 惰性求值 后者返回整个列表 3中只有range类似2的xrange - 3 bin() 整数转二进制 - x进制数写法 0?111 e.g. 二0b111 八0o777 - 不等运算符 2有 != 和 <> 3只有前者 1. python的垃圾回收机制 https://www.cnblogs.com/ajianbeyourself/p/11151498.html - 引用计数 每个对象含一个ob_ref字段 计算被引用次数 清0立刻回收 - 标记清除 解决对象的循环引用问题 e.g. AB 相互引用 但是AB都del了 ; 阶段1给活动对象打标记 阶段2 回收非活动对象 - 分代回收 将内存根据对象的存活时间划分为不同的集合,每个集合称为一个代;垃圾收集频率与对象的存活时间的增大而减小
文章信息
标题:Python 刷题笔记
作者:快刀切草莓君
分类:程序设计语言
发布时间:2020年2月17日
最近编辑:2020年5月25日
浏览量:2738
↑