Python 学习之路

Posted codehu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python 学习之路相关的知识,希望对你有一定的参考价值。

Python 学习之路(二)

以下所用的是Python 3.6

一、条件语句

简单判断

1 if 判断条件:
2     执行语句……
3 else4     执行语句……

复杂判断

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"...]

以上是关于Python 学习之路的主要内容,如果未能解决你的问题,请参考以下文章

机器学习之路: python 实践 word2vec 词向量技术

python学习之路01

python之路之前没搞明白4面向对象(封装)

python 机器学习有用的代码片段

Python学习之路——模块

Python学习之路-函数