for i, j in zip(list1, list2):
t = [1 if i%2==0 else 0 for i in range(10)]
必须带else分支,否则这种情况下的列表项就没值了……就算是赋予空置,也要写个else None上去……
列表操作的时候,一行写不下?假如说下面代码太长了,[2]不得不写在下一行:
a = [1] +
[2]
但是发现报错了,这个时候应该:
a = [1] + \
[2]
相当于英文写作时单词没写完但该行没位置了,使用连字符一样。
s = 'code'
print(s[-1])
print(s[-3:-1])
对于第二行代码,输出为'e',即输出倒数第1位,当i>0,s[-i]表示倒数第i位。
对于第三行代码,输出为'od',即输出倒数第3位到倒数第2位,当a>b>0,s[-a:-b]表示倒数第a位到倒数第b+1位。
在相应的行号后面单击即可设置断点。
Step Into(F7):执行下一步,遇到函数会单步进入。
Step Over(F8):执行下一步,遇到函数会将其整个执行完,不会单步进入。
Step Out(Shift+F8):若执行位置所处函数内无断点,会执行完函数剩余部分并跳出函数,若有则跳到断点。
若要调试通过控制台传入参数的程序,则:
选择相应程序,在Configuration下的Parameters填入相关参数即可,例如:
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('-n')
args = parser.parse_args()
以上为格式,除了第三行其他照抄就行,第三行表示使用命令行调用该程序时可添加一个参数“-n”。
每个parser.add_argument语句定义一个命令行参数,接下来详解该语句:
parser.add_argument('name')
parser.add_argument('-name')
parser.add_argument('--name')
parser.add_argument('-n', '--name')
第一行,添加一个命令行参数name,这个参数没有像前面以“-”或“--”开头,则说明这个参数在命令行中是必须输入的。
第二行和第三行的以“-”或“--”开头,说明这些参数在命令行中可输也可不输,如果要输,则通过参数名指定(前面的“-”或“--”不能省)。第一行的写法则不需要。如果有多个需要指定的变量,前后顺序无所谓。
第四行原参数为“--name”,但同时也为其定义了一个简版,在命令行中通过“-n”和“--name”都可以传值。注意按照格式,简版以“-”开头,放前面,完整的以“--”开头,放后面。
这些通过命令行传入的值如何使用呢?通过args.参数名,例如上面四条,无论前面几个“-”,都通过args.name访问(第四条语句,简版完整版同在,则以完整版参数名来访问),数据类型默认都为string。
除了以上的基本定义,parser.add_argument还可通过一些属性实现更多功能:
调用了argparse,命令行调用的时候会自带一个-h(完整:--help),功能类似于cmd中的help命令,显示所有自定义参数的描述,这个描述可通过help属性自定义:
parser.add_argument('-n', '--name', help='Tell us your name')
type指定传入值的数据类型,默认为string。default为未通过命令行赋值的变量赋以默认值。
parser.add_argument('-number', default=200, type=int)
对于那些又无默认值,又未通过命令行赋值的变量,其值一般为None。
为传入的值进行规范,传入的值必须为choices列表规定的合法值,否则会报错。
parser.add_argument('-number', choices=[1,2,3], type=int)
当required=True时,说明定义的变量必须要通过命令行传值。(而且也要通过“-number”指定)
parser.add_argument('-number', required=True, type=int)
如果列表要通过命令行传值,可通过nargs指定一次传入值的个数,如果个数不确定,可以写为:
parser.add_argument('-list', nargs='+')
传入值至少为一个。如果nargs='*',表示传入值至少0个,若nargs='?',则传入值为0或1个。
action有两个值:store_true和store_false,该参数起到的是“开关”的作用,不调用该参数则为默认值,一旦有“调用”这个action,值就变动为action中指定的值。
parser.add_argument('--b', action='store_true', default=False)
输出b,可以看到:
该方法是ArgumentParser类实例化后的对象的方法,可用于多次传参。假如现在我要获取男生的身高和女生的体重,在输入的时候,第一项是性别,第二项则取决于第一项的输入,则:
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('-g','--gender')
exist_parameters, unparsed = parser.parse_known_args()
if exist_parameters.__getattribute__('gender') == 'male':
parser.add_argument('-t', '--tall')
else:
parser.add_argument('-w', '--weight')
args = parser.parse_args()
输入:python a.py -g male -t 173
通过parse_known_args,已经指明的gender和对应值“male”被存入了exist_parameters,而因为-t还未被指派,暂时存入unparsed(以列表形式:['-t', '173'])
对于exist_parameters,使用__getattribute__获取到其内部已指派好的参数值,即可知晓下一步引入何种参数。
如果在unparsed中的值直到最后(指定义args变量这一步)也没有通过add_argument进行指派,则会报错。
import sys
k = [1, 2, 3]
print(sys.getsizeof(k))
以上代码输出88,表示k占用88个字节。
有意思的地方在于:
import sys
list1 = range(1000)
list2 = [i for i in range(1000)]
print(sys.getsizeof(list1)) #48
print(sys.getsizeof(list2)) #9024
用range函数返回类似list的类,相比于直接生成一个列表,会节省非常多空间。
以下值会被python认为是False:
None 0 "" '' () [] {}
编译器会隐式转换这些值。虽然都认作False,但它们之间是不相等的,甚至直接与False相比,它们也是不相等的:
print([]==())
print([]==False)
输出都为False。
例如,从网络上下载一张图片:
import urllib.request
url = 'http://www.ZergWang.com/789.png'
urllib.request.urlretrieve(url, 'zergwang.png')
使用fpdf库:
from fpdf import FPDF
from PIL import Image
pages = 10
img = Image.open('0.png')
width, height = img.size[0], img.size[1]
newPDF = FPDF(unit = "pt", format = [width, height])
for i in range(pages):
newPDF.add_page()
newPDF.image('%s.png'%i, 0, 0)
newPDF.output('example.pdf', 'F')