Python 学习之路(二)
以下所用的是Python 3.6
一、条件语句
简单判断
1 if 判断条件: 2 执行语句…… 3 else: 4 执行语句……
复杂判断
1 if 判断条件1: 2 执行语句1…… 3 elif 判断条件2: 4 执行语句2…… 5 elif 判断条件3: 6 执行语句3…… 7 else: 8 执行语句4……
二、循环语句
2.1 while语句
和其他语言一样,不同的是多了else语句。在 python 中,while … else 在循环条件为 false 时执行 else 语句块。
例子:
1 count = 0 2 while count < 5: 3 print count, " is less than 5" 4 count = count + 1 5 else: 6 print count, " is not less than 5"
2.2 for语句
1 for iterating_var in sequence: 2 statements(s)
else语句: 在 python 中,for … else 表示这样的意思,for 中的语句和普通的没有区别,else 中的语句会在循环正常执行完(即 for 不是通过 break 跳出而中断的)的情况下执行,while … else 也是一样。
1 for i in range(2,num): # 根据因子迭代 2 if num%i == 0: # 确定第一个因子 3 j=num/i # 计算第二个因子 4 print ‘%d 等于 %d * %d‘ % (num,i,j) 5 break # 跳出当前循环 6 else: # 循环的 else 部分 7 print num, ‘是一个质数‘
2.3 break,continue语句
用在while,for语句中
2.4 pass语句
充当一个占位语句。
2.5 range函数
1 range(n) # 表示从0到n-1 2 range(a,b) #表示从a到b-1 3 range(a,b,step) #表示从a到b-1,步长为step
例:
1 for i in range(5,9): 2 print(i)
三、函数
- 函数代码块以 def 关键词开头,后接函数标识符名称和圆括号 ()。
- 任何传入参数和自变量必须放在圆括号中间,圆括号之间可以用于定义参数。
- 函数的第一行语句可以选择性地使用文档字符串—用于存放函数说明。
- 函数内容以冒号起始,并且缩进。
- return [表达式] 结束函数,选择性地返回一个值给调用方。不带表达式的return相当于返回 None。
3.1 函数举例
1 # 定义函数 2 def printStr( str ): 3 "打印任何传入的字符串" 4 print (str); 5 return; 6 7 printStr("name") # 函数调用
3.2 函数中参数的传递
在 python 中,类型属于对象,变量是没有类型的。strings, tuples, 和 numbers 是不可更改的对象,而 list,dict 等则是可以修改的对象,可以理解为引用。
3.3 参数的几种方式
- 必需参数:必需参数须以正确的顺序传入函数,调用时的数量必须和声明时的一样。
- 关键字参数:关键字参数和函数调用关系紧密,函数调用使用关键字参数来确定传入的参数值。
1 #可写函数说明 2 def printStr( str ): 3 "打印任何传入的字符串" 4 print (str); 5 return; 6 7 #调用printStr函数 8 printme( str = "name");
- 默认参数:调用函数时,如果没有传递参数,则会使用默认参数。
1 def printStr( str="moren" ): 2 "打印任何传入的字符串" 3 print (str); 4 return;
- 不定长参数:函数能处理比当初声明时更多的参数。
1 def functionname([formal_args,] *var_args_tuple ): 2 "函数_文档字符串" 3 function_suite 4 return [expression]
* 后的变量名会存放所有未命名的变量参数,是一个元组,没有参数时,为一个空元组。
3.4 return语句
例:
1 def sum( arg1, arg2 ): 2 # 返回2个参数的和." 3 total = arg1 + arg2 4 return total;
3.5 Lambda表达式
- lambda 只是一个表达式,函数体比 def 简单很多。
- lambda的主体是一个表达式,而不是一个代码块。仅仅能在lambda表达式中封装有限的逻辑进去。
- lambda 函数拥有自己的命名空间,且不能访问自己参数列表之外或全局命名空间里的参数。
- 虽然lambda函数看起来只能写一行,却不等同于C或C++的内联函数,后者的目的是调用小函数时不占用栈内存从而增加运行效率。
- 格式:lambda [arg1 [,arg2,.....argn]]:expression
1 sum = lambda arg1, arg2: arg1 + arg2;
3.6 变量作用域
Python 中只有模块(module),类(class)以及函数(def、lambda)才会引入新的作用域。Python的作用域一共有4种,分别是:
- L (Local) 局部作用域
- E (Enclosing) 闭包函数外的函数中
- G (Global) 全局作用域
- B (Built-in) 内建作用域
- 当内部作用域想修改外部作用域的变量使用:global(修改外部变量) 和 nonlocal(修改嵌套作用域)关键字
例1:
1 num = 1 2 def fun(): 3 global num # 需要使用 global 关键字声明 4 print(num) 5 num = 123 6 print(num)
例2:
1 def outer(): 2 num = 10 3 def inner(): 4 nonlocal num # nonlocal关键字声明 5 num = 100 6 print(num) 7 inner() 8 print(num) 9 outer()
四、迭代器和生成器
迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。 迭代器有两个基本的方法:iter() 和 next()。
4.1 迭代器
1 list=[1,2,3,4] 2 it = iter(list) # 创建迭代器对象 3 for x in it: 4 print (x, end=" ")
4.2 生成器
跟普通函数不同的是,生成器是一个返回迭代器的函数,只能用于迭代操作,更简单点理解生成器就是一个迭代器。在调用生成器运行的过程中,每次遇到 yield 时函数会暂停并保存当前所有的运行信息,返回 yield 的值, 并在下一次执行 next() 方法时从当前位置继续运行。
1 import sys 2 3 def fibonacci(n): # 生成器函数 - 斐波那契 4 a, b, counter = 0, 1, 0 5 while True: 6 if (counter > n): 7 return 8 yield a 9 a, b = b, a + b 10 counter += 1 11 f = fibonacci(10) # f 是一个迭代器,由生成器返回生成 12 13 while True: 14 try: 15 print (next(f), end=" ") 16 except StopIteration: 17 sys.exit()
五、模块
模块是一个包含所有你定义的函数和变量的文件,其后缀名是.py。模块可以被别的程序引入,以使用该模块中的函数等功能。可以理解为库,通C/C++ 的include。
5.1 import语句
一个模块只会被导入一次。导入模块会从默认路径中选择,从当前工作目录,也可以通过sys中的sys.path来输出目录路径,来寻找这个包中包含的子目录。
1 import module1[, module2[,... moduleN]
例:
1 import sys
5.2 from…import 语句
Python的from语句让你从模块中导入一个指定的部分到当前命名空间中,语法如下:
1 from modname import name1[, name2[, ... nameN]] 2 from modname import * #导入全部模块
这将把所有的名字都导入进来,但是那些由单一下划线(_)开头的名字不在此例。大多数情况, Python程序员不使用这种方法,因为引入的其它来源的命名,很可能覆盖了已有的定义。
5.3 __name__属性
如果我们想在模块被引入时,模块中的某一程序块不执行,我们可以用__name__属性来使该程序块仅在该模块自身运行时执行。
#!/usr/bin/python3 # Filename: using_name.py if __name__ == ‘__main__‘: print(‘程序自身在运行‘)#在该模块内运行,才会执行 else: print(‘我来自另一模块‘)#在外部模块导入本模块,才会执行
5.4 包
目录只有包含一个叫做__init__.py的文件才会被认作是一个包,主要是为了避免一些滥俗的名字(比如叫做 string)不小心的影响搜索路径中的有效模块。 最简单的情况,放一个空的__init__.py就可以了。当然这个文件中也可以包含一些初始化代码或者为 __all__变量赋值。 例:
1 #第一种形式 2 import 根目录.二级目录.三级目录...# 根目录是存放着__init__.py的文件夹,也就是包 3 4 #第二种形式 5 from 根目录.二级目录.三级目录... import 对应函数 #导入对应模块中的函数 6 from packagename import * #导入该目录下的所有模块,但一般不采用这种做法
all__可以在import * 的时候只导入指定的.py模块。案例如下,定义在__init.py文件中
1 __all__ = ["模块1","模块2"...]