我们写C写习惯了,写Python因为习惯不一样,有时候会觉得很不舒服。记录一下怎么把Python写的很像C
一、首先整个main出来
def main():
print("Hello World!")
if __name__ == "__main__":
main()
python是一种解释型脚本语言,和C/C++语言不同,C/C++程序从main函数开始执行,python程序从开始到结尾顺序执行。
那么如果什么函数都不写,python是直接从头执行到脚的。所以构造一个函数入口,强行让他从main开始执行,符合c语言习惯,很爽。
这个有什么作用呢?当多个python文件共同组成一个工程时,这就比较好用了,不是以这个py文件为入口的时候,就不会执行这个文件的main。
main是什么
Python主函数是任何Python程序的开始。当我们运行程序时,解释器按顺序运行代码,如果作为模块导入,则不会运行main函数,但是main函数只有在作为Python程序运行时才会执行。
因此,如果您直接运行脚本,Python会将“main”赋给__name__,即__name__=“main”。(这发生在后台)。
执行参数
通过sys库传参。
import sys
print ('参数个数为:', len(sys.argv), '个参数。')
print ('参数列表:', str(sys.argv))
print ('脚本名:', str(sys.argv[0]))
$ python test.py arg1 arg2 arg3
参数个数为: 4 个参数。
参数列表: ['test.py', 'arg1', 'arg2', 'arg3']
脚本名: test.py
二、for循环
获取序号
当我们在写python的for循环时,一般会以某个列表来循环
#打印列表list里的元素
for i in list:
print(i)
#打印1到99中的奇数
for i in range(1, 100, 2):
print(i)
这样做很方便,但是如果我想要获取现在循环在执行第几次(序号),就很难受了
有几种写法比较c。首先创建一个list
list = ["123", "abc", "ABC"]
如下三种写法,输出都是
1 123
2 abc
3 ABC
1 这就有点挫了
for i in list:
print (list.index(i) + 1, i)
2 还行
for i in range(len(list)):
print(i, list[i])
3 十分推荐,显得很专业
for i, val in enumerate(list):
print(i, val)
其他用法
遍历字典
d = {'a':1, 'b':2, 'c':3}
for key, value in d.items():
print(key, value)
output
a 1
b 2
c 3
赋值后拆分
t = [(1,2), (3,4), (5,6)]
for both in t:
a,b = both
print(a,b)
三、print语句
官网解释
print(*objects,sep=’ ‘,end=’\n’,file=sys.stdout,flush=False) 参数说明
objects – 复数,说明可以一次输出多个对象。输出多个对象时,需要用 , 分隔。 sep – 用来间隔多个对象,默认值是一个空格。
end – 用来设定以什么结尾。默认值是换行符 \n,我们可以换成其他字符串。(所以几乎每个输出,都差不多都会换行) file –
要写入的文件对象。 flush – 输出是否被缓存通常决定于 file,但如果 flush 关键字参数为 True,流会被强制刷新。
格式符%
最能像C语言的printf,就是这个。格式符和c语言一样,然后在字符串后接**%(arg)**就行
print ("His name is %s"%("Aviad"))
#相当于 printf("His name is %s\n", "Aviad");
print ("He is %d years old"%(25))
print ("His height is %.2f m"%(1.83234))
#乘法运算
print('%d * %d = %d'%(j, i, j*i), end="\t")
end
print默认使用时,是自带一个换行的。如果不想换行,可以在后面使用end字段。想跟什么跟什么。end参数用来设定以什么结尾,默认是\n换行符。
#不换行
print("Hello World!", end = "")
#每个输出后跟空格
print(i, end = " ")
sep
>>> print("www", "runoob", "com", sep=".") # 设置输出对象中的间隔符
www.runoob.com
格式化字符串f
lst=[1,'xiaoming',29.5,'123456644']
for _ in lst:
print(f'{_}的类型为{type(_)}')
#output
#1的类型为<class 'int'>
#xiaoming的类型为<class 'str'>
#29.5的类型为<class 'float'>
#123456644的类型为<class 'str'>
print(f’{}的类型为{type()}‘)
格式为:print(f’{}{}')。
f,表示对字符串格式化,‘ ’中为相应的内容。
{ }里面为替换字段,文中的替换字段为变量‘_’,它是指列表lst中的内容。
也可以
for index, target in enumerate(['spam', 'eggs', 'ham'], 10):
print(f'{target} is at index {index}')
#output
#spam is at index 10
#eggs is at index 11
#ham is at index 12
四、例子
其实差距也不是特别大
将图片转为RGB888
python风格
from PIL import Image
import numpy as np
out = Image.open("in.png").convert("RGB")#以RGB方式打开这张图
img=np.array(out)
#print(out.mode)
#print(out.size)
#print(img.shape)
np.save(file="out.bin", arr=img)#这样保存有numpy的文件头
c风格
#!/usr/bin/python
import os,sys,struct
from PIL import Image
# 图片(jpg/png)转RGB565
def main():
infile = "in.png"
outfile = "res.bin"
im=Image.open(infile)
im.show()
print("read %s\nImage Width:%d Height:%d" % (infile, im.size[0], im.size[1]))
f = open(outfile, "wb")
pix = im.load() #load pixel array
for h in range(im.size[1]):
for w in range(im.size[0]):
R = pix[w, h][0]
G = pix[w, h][1]
B = pix[w, h][2]
rgb = (R << 16) | (G << 8) | B
# 转换的图是小端的,所以先后半字节,再前半字节
f.write(struct.pack('B', rgb & 255))
f.write(struct.pack('B', (rgb >> 8) & 255))
f.write(struct.pack('B', (rgb >> 16) & 255))
f.close()
print("write to %s" % outfile)
if __name__ == "__main__":
sys.exit(main())