python编程小知识tips 20220720

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高级用法,直接看图
在这里插入图片描述
3、range生成的是list,无法进行中间改变

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

在这里插入图片描述
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、递归定义的特殊符号
在这里插入图片描述
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转化为十进制
在这里插入图片描述
在这里插入图片描述
可见进制转换后变成了str
8、字符串是不可以随意修改的
在这里插入图片描述
下面这种改法,x不会改变text中的enchar
在这里插入图片描述
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,表示完全透明,看到的就都是背景图像。
  在这里插入图片描述
11、绿屏抠像原理

偏绿色的判断

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

在这里插入图片描述

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

在这里插入图片描述

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

在这里插入图片描述

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

补充说明

上面给出的两个值是经验值,而不是理论值,比例比 40% 高一些或低一些、取值比 60 大一些或小一些,其实都可以进行判断,某些时候甚至效果更好。
  此外,判断偏绿色的方法也不唯一,例如,条件g-r>30 and g-b>30(即绿色分量比红、蓝色分量的取值都大 30 以上)也可以取得较好的抠图效果。
12、乘二取整法
在这里插入图片描述
12、找下标
n = b.index(‘.’) #小数点的编号,即整数部分的总位数

13、超重点:list的join操作

在这里插入图片描述
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、二进制加一的特殊算法,值得记忆
在这里插入图片描述
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,从而不用再直接表示小数点了,因为它的位置是已知的。这种表示方式叫定点数。
  在这里插入图片描述
二进制转十进制 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,'不是数字字符')  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

irrationality

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值