一、基础知识
1、冯诺依曼体系的计算机五大部件
I / O 设备,内存,CPU的运算器和控制器;
其中CPU中还有与其同频的寄存器,以及为避免重新从内存加载而设置的多级缓存cache,一般是频率逐级递减的三级,但频率都高于内存;寄存器和内存都是掉电即失,寄存器就像CPU和内存进行数据传输的中间站、搬运工;
2、计算机语言的发展
关于转换工具Interpreter:编译器和解释器
C,C++ 用编译器进行本地编译,将源代码转换成本机的CPU指令;
Java,Python,C# 用解释器将源代码编译成中间代码Bytecode,再在虚拟机VM上运行;
3、Python的解释器
官方CPython:最广泛;
IPython:更强交互能力的CPython;
PyPy:Python编写,采用动态编译JIT技术进行内存动态优化,效率及性能优于CPython,劣势是支持的库不多;
JPython:把Python源代码编译成Java字节码,在JVM上运行,一般用在对VM有高性能要求时;
4、Python语言特点
动态编译型语言,强类型语言;
不用事先声明变量类型,缺点是可能在运行时才发现问题;不同类型间操作必须先强制类型转换为同一类型,而不像有的弱类型语言会进行隐式类型转换;
5、位运算符
位与&:全1为1,有0则0,类似于按位相乘;例 若x&1=1,则x为奇数;
位或 | :有1则1,全0则0;
异或 ^:相异为1,相同为0;
取反~:按位取反;
左移<<:按位左移,高位舍弃低位补0,多用来乘除2的倍数,在C语言中更常用,很高效;
右移>>:按位右移,例 32 // 8 相当于32>>3;
6、运算符优先级
从高到低:算术运算符,比较运算符,逻辑运算符(not and or),赋值运算符;
7、Python内存管理
垃圾回收机制GC和引用计数;
引用计数可用import sys及sys.getrefcount(x)查询;
8、列表list,链表link,队列queue,栈stack
list:有顺序的线性结构,可变、可索引、可迭代;便于查询不便于修改;
link:有顺序的非线性结构;便于修改不便于查询;
queue:先进先出;类似于一个一个走;
stack:后进先出;类似于摆盘子;
9、可迭代对象iterable
是一个对象,一个可遍历集合;
例:range(stop)- > range object
返回值为一个range对象,range(start,stop),是一个可迭代对象,不是集合内部的可迭代元素。
二、做题思考
1、折半思想
做有些判断题时,可先将总范围预估一下、一分为二,写成一个if-else语句,再分别在if和else的代码块中嵌套新的if-else语句,这样效率会比if-elif-else层层下来效率更高;
2、对称思想
遇到有对称性问题时,可考虑将区间范围变为[-n,n),辅以三元表达式 或绝对值函数abs(),让代码更加简洁;
3、设置flag开关
例:从高位到低位打印一个五位数,输入值可能只是个三位数
#立flag = False控制,以防最高位是0
n=int(input("pls input five number:"))
flag=False
for i in range(5):
x=10**(4-i)
a=n//x
if a or flag:
print(a)
flag=True
n%=x
若输入00501,分母、取整和取余每次都正常循环着,if 后的 condition 后加了取整值a和flag开关两个条件,flag开始时为False,两个条件用or连接,使得开始时condition主要由a决定,只有a为真,即高位a不为0时,才打印a,并开启开关,然后condition再跟a无关,即使再遇到a==0也不影响print的执行,遇到非零的高位之后的所有低位都能顺利打印;
flag在用于某些需要一键开启、关闭的场景中,可灵活使用;
4、一些新思路
例:打印边长为n的正方形
n=int(input("n=:"))
for i in range(n):
for j in range(n):
if i==0 or i==n-1 or j==0 or j==n-1:
print("*",end=" ")
else:
print(" ",end=" ")
print()
两层边界用两层循环控制,要点在于找出边界的规律,及print函数的换行控制。
5、写代码的小技巧
1)while多用在不知循环次数、用break打断才退出的情况,其中while True最常用;for循环多用于已知循环次数时;
#打印若干数算术平均数,初始代码
s=float(input("pls input number:"))
a=input("pls input new number:")
c=1
while a:
s+=float(a)
c+=1
print("average:",s/c)
a=input("pls input another number:")
#打印若干数算术平均数,while True形式
s=float(input("pls input number:"))
c=1
while True:
a=input("pls input another number:")
if a=="":
break
else:
s+=float(a)
c+=1
print("average:",s/c)
用while True可省略部分重复代码;
2)写Python程序时,擅用while-else和for-else循环;
3)方法中参数为value时慎用,多考虑效率问题,因用value索引大多需遍历、比较慢;
4)对输入值做判断时,可考虑先不做int类型转换,对字符串做非空判断有时更便利。