1、格式化是如输出

def p(n):
    print("f(%d)=%d%s素数" % n % f(n) % ("是" if isprime(n) else "不是"))

即TypeError:格式字符串的参数不足,本来以为少了%,后来对着度娘观摩半天后,终于意识到一堆参数只需要一个%,剩下的使用括号即可,正确代码为(其实只有最后一行错了):

def p(n):
    print("f(%d)=%d%s素数" %( n, f(n), ("是" if isprime(n) else "不是")))

2、map高级用法,直接看图

python用mask对文件夹中的高亮区域遮挡_开发语言


3、range生成的是list,无法进行中间改变

for i in range(1,5):
    print(i)
    i -= 1

python用mask对文件夹中的高亮区域遮挡_python_02


4、字符串的start with属性

if not ID.startswith('20'):   #如果学号未以20开头  
    print('未以20开头')

5、负一整除
在若干次循环后,d的值一直为-1,这次循环是-1,下次循环整除2后还是-1,也就是说,-1//2的结果是-1而不是0,可以验证一下这个说法,程序如下:

print(-1//2) #-1//2的结果是-1(请自行上网查询负数整除如何进行)
  所以,输入负数时会出现死循环。

6、递归定义的特殊符号

python用mask对文件夹中的高亮区域遮挡_python_03


7、进制转化

print(bin(37)) #bin(n)是将十进制整数n转换为二进制
 print(oct(37)) #oct(n)是将十进制整数n转换为八进制
 print(hex(37)) #bin(n)是将十进制整数n转换为十六进制
 print(int(‘100101’, 2)) #int(n, 2)是将二进制数n转化为十进制
 print(int(‘45’, 8)) #int(n, 8)是将八进制数n转化为十进制
 print(int(‘25’, 16)) #int(n, 16)是将十六进制数n转化为十进制

python用mask对文件夹中的高亮区域遮挡_python_04


python用mask对文件夹中的高亮区域遮挡_十进制_05


可见进制转换后变成了str

8、字符串是不可以随意修改的

python用mask对文件夹中的高亮区域遮挡_算法_06


下面这种改法,x不会改变text中的enchar

python用mask对文件夹中的高亮区域遮挡_算法_07


9、三通道图像处理

from PIL import Image

img = Image.open(‘src/step2/head.jpg’)

pix = img.getpixel((23, 5)) #获取(23, 5)处像素的颜色

print(pix)

  其中,第 3 行中getpixel函数的功能是获取一个像素的颜色信息,其参数是用元组类型表示的像素坐标。

  程序运行结果是一个包含 3 个整数的元组(0, 156, 68),这就是计算机表示颜色的一种方法,称为 RGB 颜色。

10、透明度

RGBA颜色

在 RGB 颜色的基础上,再加入一个 A 分量,就构成了 RGBA 颜色。A 分量表示的是像素透明度,取值也是 0~255,0 表示完全透明,255 表示完全不透明。

  在现实生活中,要看一个物体的透明度,可以通过它看后面的景象,透明度越高,后面的景象就看得越清晰,颜色的透明度也是类似的。例如,在下图中,第 1 个矩形中颜色的透明度是 255,表示完全不透明,将它放到背景图像上,则只能看到这个颜色,而看不到背景;第 2 个颜色的透明度是 100,表示半透明,所以既能看到这个颜色,也能透过这个颜色隐约看到背景图像;第 3 个颜色的透明度是 0,表示完全透明,看到的就都是背景图像。

  

python用mask对文件夹中的高亮区域遮挡_算法_08


11、绿屏抠像原理

偏绿色的判断

初始代码给出了绿幕抠像的程序框架,与上关代码基本一样,区别在于:上关是将所有像素都改为半透明,而本关只对偏绿色像素进行修改(改为完全透明)。所以,只要在第 9 行问号处给出偏绿色像素的判断条件,即可过关。
  RGB 颜色包含红绿蓝三个分量,每个分量的取值范围是 0~255,一个分量的数值越大,表示这个分量占的比例越高。所以,绿色分量数值越大,颜色就越偏绿色,比如在下图中,保持红色和蓝色分量数值不变,增大绿色分量的数值,颜色就越来越偏绿色。

python用mask对文件夹中的高亮区域遮挡_算法_09

绿色分量占的比例可以用绿色分量除以三个分量之和来表示,即 (G+1)/(R+G+B+3),这里给每个分量均增加 1,是为了避免 R、G、B 分量均为 0 时发生除 0 错误。根据视觉效果可以看出,当绿色分量的比例超过 40% 时,颜色看起来就是偏绿色了。所以,得偏绿色判断条件如下:

python用mask对文件夹中的高亮区域遮挡_开发语言_10

例如在下图中,几种颜色的红色和蓝色分量都是 0,所以绿色分量占的比例都是 100%。但当绿色分量取值较小的时候,颜色看起来是黑色,当超过一定数值时看起来才是绿色。

python用mask对文件夹中的高亮区域遮挡_算法_11

所以,在“比例超过 40%”这个条件的基础上,还要再加一个条件,绿色分量的取值要大于某一个值,根据视觉效果,这个值可以设置为 60,即在程序第 9 行中增加条件 G>60。

补充说明

上面给出的两个值是经验值,而不是理论值,比例比 40% 高一些或低一些、取值比 60 大一些或小一些,其实都可以进行判断,某些时候甚至效果更好。

  此外,判断偏绿色的方法也不唯一,例如,条件g-r>30 and g-b>30(即绿色分量比红、蓝色分量的取值都大 30 以上)也可以取得较好的抠图效果。

12、乘二取整法

python用mask对文件夹中的高亮区域遮挡_数字字符_12


12、找下标

n = b.index(‘.’) #小数点的编号,即整数部分的总位数

13、超重点:list的join操作

python用mask对文件夹中的高亮区域遮挡_算法_13


14、保留一位小数的最简单方法

b 保留一位小数(用round函数实现,如round(3.14, 1))

15、map典型案例解析ip地址
 ########## Begin ##########
 def DectoBin(t):
 t = int(t)
 def DtB(t):
 if t == 0:
 return ‘’
 return DtB(t//2)+str(t%2)
 if t == 0:
 return ‘00000000’
 if t < 0:
 return ‘-’+DtB(-t)
 return DtB(t)
 def BintoDec(b):
 s = 0
 for i in range(len(b)):
 s += 2**iint(b[len(b)-i-1])
 return str(s)
 def NOT(x):
 b = ‘’
 for i in x:
 a = ‘1’ if i ==‘0’ else ‘0’
 b += a
 return b
 def AND(x,y):
 ans = ‘’
 if len(x)<len(y):
 x = ‘0’(len(y)-len(x))+x
 else:
 y = ‘0’*(len(x)-len(y))+y
 for i in range(len(x)):
 ans += ‘1’ if x[i] == ‘1’ and y[i] == ‘1’ else ‘0’
 return ans
 def parseIP(ip,mask):
 ipls = list(map(DectoBin,ip.split(‘.’)))
 mkls = list(map(DectoBin,mask.split(‘.’)))
 # print(mkls)
 netID = []
 hostID = []
 mk0ls = list(map(NOT,mkls))
 # print(mk0ls)
 netID = list(map(BintoDec,list(map(AND,ipls,mkls))))
 hostID = list(map(BintoDec,list(map(AND,ipls,mk0ls))))
 return ‘.’.join(netID),‘.’.join(hostID)
 ########## End ##########
 ip = input() #IP地址
 mask = input() #子网掩码
 netID, hostID = parseIP(ip, mask)
 print(‘网络号:’, netID) #网络号
 print(‘主机号:’, hostID) #主机号

17、二进制加一的特殊算法,值得记忆

python用mask对文件夹中的高亮区域遮挡_算法_14


18、定点数 与 浮点数

第 1 关提到,二进制中除了 0 和 1,还有 +、− 和 .,而计算机底层只有 0 和 1。之前关卡解决的是如何用 0 和 1 表示正负号的问题,从本关开始要进一步解决小数点的问题。

  问题的难点在于不能直接用 0 和 1 表示小数点这个符号。例如,若用 1 表示小数点,则二进制数 101.01 对应的表示为 101101,计算机无法区分哪个 1 是小数点,用 0 或其它 01 串表示都存在类似问题。

  解决方法是固定小数点的位置。例如,可以做如下规定,在 8 位原码中,小数点位置总是在第 4 位和第 5 位之间,固定不变,则 01010100 表示的数是 +101.0100,即 101.01,从而不用再直接表示小数点了,因为它的位置是已知的。这种表示方式叫定点数。

  

python用mask对文件夹中的高亮区域遮挡_开发语言_15


二进制转十进制 int(byte,2)

19、超重点 zip构造字典

list1 = [‘key1’,‘key2’,‘key3’]
 list2 = [‘1’,‘2’,‘3’]
 print(dict(zip(list1,list2)))

20、  判断一个字符是否为数字字符,方法有很多,下面给出其中 3 种。

x = '2'   
if x in '0123456789':     #方法1  
    print(x,'是数字字符')  
else:  
    print(x,'不是数字字符')
if '0'<=x<='9':           #方法2  
    print(x,'是数字字符')   
else:  
    print(x,'不是数字字符')
if x.isdigit():           #方法3  
    print(x,'是数字字符')   
else:  
    print(x,'不是数字字符')