用C语言的习惯来写python

我们写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())
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值