python的基础语法(if,while,for,break,continue 特殊缩进)
1.python的缩进
python 关于缩进的问题
习惯了java,c++之类的宽容,初学python,被它摆了道下马威,写if else,竟然必须要我正确用缩进格式,原来在python里不能用括号来表示语句块,也不能用开始/结束标志符来表示,而是靠缩进来表示,好吧,我以后多注意
空白在Python中是重要的。事实上行首的空白是重要的。它称为缩进。在逻辑行首的空白(空格和制表符)用来决定逻辑行的缩进层次,从而用来决定语句的分组。
这意味着同一层次的语句必须有相同的缩进。每一组这样的语句称为一个块。我们将在后面的章节中看到有关块的用处的例子。
你需要记住的一样东西是错误的缩进会引发错误。例如:
i = 5
print 'Value is', i # Error! Notice a single space at the start of the line
print 'I repeat, the value is', i
当你运行这个程序的时候,你会得到下面的错误:
File "whitespace.py", line 4
print 'Value is', i # Error! Notice a single space at the start of the line
^
SyntaxError: invalid syntax
注意,在第二行的行首有一个空格。Python指示的这个错误告诉我们程序的语法是无效的,即程序没有正确地编写。它告诉你, 你不能随意地开始新的语句块 (当然除了你一直在使用的主块)。何时你能够使用新块,将会在后面的章节,如控制流中详细介绍。
如何缩进
不要混合使用制表符和空格来缩进,因为这在跨越不同的平台的时候,无法正常工作。我 强烈建议 你在每个缩进层次使用 单个制表符 或 两个或四个空格 。
选择这三种缩进风格之一。更加重要的是,选择一种风格,然后一贯地使用它,即 只 使用这一种风格。
Python的缩进应该是一个优点,刚开始可能不是非常的习惯,慢慢就行了!
当你看别人的Python代码的时候,你就会深切感受到缩进的好处。
另外,Python的缩进可以在一定程度上防止大量的代码堆积在一起,客观上促使形成良好的代码风格
Py的哲学同Perl/ruby的不同。它不会给你很多功能,然后警告你说,这个这个最好别用,那个那个得注意了。它认为凡是它提供给你的,都是给你用的,只要符合它的语法规范,随便怎么用都可以。如果你能写出烂代码,那说明这个设计有问题。这是一种负责任的态度。
{} 可以允许程序员写出很烂的代码,而这与Py的哲学不符。所以Py在设计之处就规定,用缩进而不是{}表示程序块。
这并没有什么不好的,在绝大多数情况下,缩进比{}更清楚。
但是Py的缩进也不是无往不利的。个人感觉有两个地方不方便。
第一,粘贴代码的时候修改缩进不方便。但好在我有vi。
第二,html嵌套py代码的时候,要同时维护两套缩进,html的和py的。这个太困难了。我觉得这是妨碍PSP流行的最重要的原因。
不可否认,python的代码一旦缩进乱了,是无法重新格式化的。
2.
python的if判断
while循环语法结构
#!/usr/bin/env python sum100 = 0 counter = 1 while counter <= 100: sum100 += counter counter += 1 print "result is %d" % sum100
4.for 循环
for循环可以用来遍历某一对象(遍历:通俗点说,就是把这个循环中的第一个元素到最后一个元素依次访问一次)。for循环的基本结构如下:
具体看这个案例:
设计一个函数,在桌面创建10个文本,用数字从1-10依次给它们命名。
1 def text_create(): 2 path = '/Users/duwangdan/Desktop/' 3 for text_name in range(1,11): 4 # 1-10的范围需要用到range函数 5 with open (path + str(text_name) + '.txt','w') as text: 6 # with...as的用法正文内会详细介绍 7 text.write(str(text_name)) 8 text.close() 9 print('Done') 10 11 text_create()
现在我们来理解下每行代码。
第1行:定义一个text_create函数;
第2行:给变量path赋值为桌面路径;
第3行:将1-10范围内的每个数字依次装入变量text_name中,每次命名一个文件;
第5行:打开位于桌面的txt文件,并给每一个text执行写入操作;
第7行:给每个文件依次命名;
第8行:关闭文件;
第9行:执行完一次命名操作后显示一个Done;
第11行:调用函数。
案例中提到了“with...as”,在Python中,“with...as”语法是用来代替传统的“try...finally”的。
比如:打开桌面的test文件,尝试读取文件内容,最后关闭文件。
1 file = open('/Users/duwangdan/Desktop/test.txt') 2 try: 3 data = file.read() 4 finally: 5 file.close()
虽然这段代码执行良好,但比较冗长,换成用“with...as”来表达后,代码会更为简洁。
1 with open('/Users/duwangdan/Desktop/test.txt') as file: 2 data = file.read()
除了上面的单层循环之外,还有一种常见的循环,是嵌套循环。
比如用嵌套循环实现九九乘法口诀。
1 for i in range(1,10): 2 for j in range(1,10): 3 print('{} X {} = {}'.format(i,j,i*j))
最外层的循环,依次将1-9的数字储存在变量i中;变量i每取一次值,内层循环就依次将1-9的数字储存在变量j中;最后打印出当前的i、j、和i*j的值。
从Python2.6开始,新增了format函数,用来格式化字符串,可以通过{}.format来实现。在上面这个案例中,将i、j、i*j的值分别存入前面的{ }中,然后做好格式化,统一形式。
range
函数说明:range([start,] stop[, step]),根据start与stop指定的范围以及step设定的步长,生成一个序列。
range示例:
- >>> range(5)
- [0, 1, 2, 3, 4]
- >>> range(1,5)
- [1, 2, 3, 4]
- >>> range(0,6,2)
- [0, 2, 4]
xrange
函数说明:用法与range完全相同,所不同的是生成的不是一个数组,而是一个生成器。
xrange示例:
- >>> xrange(5)
- xrange(5)
- >>> list(xrange(5))
- [0, 1, 2, 3, 4]
- >>> xrange(1,5)
- xrange(1, 5)
- >>> list(xrange(1,5))
- [1, 2, 3, 4]
- >>> xrange(0,6,2)
- xrange(0, 6, 2)
- >>> list(xrange(0,6,2))
- [0, 2, 4]
由上面的示例可以知道:要生成很大的数字序列的时候,用xrange会比range性能优很多,因为不需要一上来就开辟一块很大的内存空间,这两个基本上都是在循环的时候用:
- for i in range(0, 100):
- print i
- for i in xrange(0, 100):
- print i
这两个输出的结果都是一样的,实际上有很多不同,range会直接生成一个list对象:
- a = range(0,100)
- print type(a)
- print a
- print a[0], a[1]
输出结果:
- <type 'list'>
- [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99]
- 0 1
而xrange则不会直接生成一个list,而是每次调用返回其中的一个值:
- a = xrange(0,100)
- print type(a)
- print a
- print a[0], a[1]
输出结果:
- <type 'xrange'>
- xrange(100)
- 0 1
所以xrange做循环的性能比range好,尤其是返回很大的时候,尽量用xrange吧,除非你是要返回一个列表。
6.break语句
#!/usr/bin/env python while True: yn = raw_input("continue?(y/n)") if yn in 'Yy': break print "work on" /usr/bin/python2.6 /root/PycharmProjects/untitled10/break1.py continue?(y/n)n work on continue?(y/n)y Process finished with exit code 0
continue语句
#!/usr/bin/env python sum100 = 0 counter = 1 while counter <= 100: counter += 1 if counter % 2 == 1: continue sum100 += counter print sum100
else语句
#!/usr/bin/env python sum10 = 0 i = 1 while i <= 10: sum10 += i i += 1 else: print sum10