Python 基础 06-模块

模块

  • 实际上一个 Python 模块是一个 Python 脚本文件。
  • 一个 Python 包是一个包含了 Python 脚本文件(至少包含有 __init__.py 文件)的目录。
  • Python 包中的 __init__.py 文件内容可以为空或包含 Python 代码。
  • 包可以嵌套,就是对应于文件系统中目录包含子目录。

Python-Modules

模块导入

  • 大型程序包含多个 Python 文件,也就是包含多个模块。
  • 文件之间的函数调用可以通过模块导入来实现。
  • 文件 A 要使用文件 B 中的函数,需要事先将文件 B 中的函数导入到文件 A 中来,这就是所谓的模块导入。
  • 在 Python 中,一个变量名或一个函数名在一个模块中(一个 Python 文件中),要么在这个文件中定义,要么通过其他模块导入过。 也就是说明这个变量名或函数名来自哪里。

模块导入规则

模块导入的关键是定位模块,定位规则如下:

  1. 跟入口文件在同一个目录下的模块或包能被找到。
  2. 根据被导入的模块和当前模块的路径关系来定位导入。
  • . 表示在当前模块所在的包下。(当前模块是代码所在的文件)
  • .. 表示在当前模块的所在包的外层目录下。

模块导入时,代码会运行一次。再次导入时,不会再次运行。

Python-Modules-Import

Python 2 的导入特性(不推荐)

  • import 语句所在模块的”同包模块”(即在同一个目录下 Python 文件)可以直接被找到。

from input import get_input

  • 了解这个用法,但是不建议使用。(因为不适用于 Python 3 )

模块相关技巧

dir(模块)

可以查看模块可使用的属性(可能是一个常量或一个函数,本质上是一个变量,内容上是一个常量或函数 )。


>>> import sys
>>> dir(sys)
['__displayhook__', '__doc__', '__excepthook__', '__name__', '__package__', '__stderr__', '__stdin__', '__stdout__', '_clear_type_cache', '_current_frames', '_getframe', 'api_version', 'argv', 'builtin_module_names', 'byteorder', 'call_tracing', 'callstats', 'copyright', 'displayhook', 'dont_write_bytecode', 'exc_clear', 'exc_info', 'exc_type', 'excepthook', 'exec_prefix', 'executable', 'exit', 'flags', 'float_info', 'getcheckinterval', 'getdefaultencoding', 'getdlopenflags', 'getfilesystemencoding', 'getprofile', 'getrecursionlimit', 'getrefcount', 'getsizeof', 'gettrace', 'hexversion', 'last_type', 'last_value', 'maxint', 'maxsize', 'maxunicode', 'meta_path', 'modules', 'path', 'path_hooks', 'path_importer_cache', 'platform', 'prefix', 'ps1', 'ps2', 'py3kwarning', 'setcheckinterval', 'setdlopenflags', 'setprofile', 'setrecursionlimit', 'settrace', 'stderr', 'stdin', 'stdout', 'subversion', 'version', 'version_info', 'warnoptions']
>>> type(sys.version)
<type 'str'>
>>> type(sys.platform)
<type 'str'>
>>> type(sys.getsizeof)
<type 'builtin_function_or_method'>

模块内置变量 __name__

  • 模块有一个内置变量 __name__,Python 内部定义好了,不需要显式定义。
  • 一般情况下其值为相对引用路径,如 “lib.parse”
  • 在入口模块中值为 __main__

if __name__ == "__main__":  # 如果为此形式,说明这个模块是通过 "python *.py" 运行的,而不是通过模块导入的 
    # do something

Python 基础 05-函数

2017-06-04-Python-Fundamental-05-Function.md

函数

  • 给一段语句起个名字,以方便日后反复调用。

生活举例: 计算机就像你的仆人,代码就是你对仆人的命令。
函数是多个命令组合在一起的复杂命令。

一个例子

对仆人:

擦桌子 -\
擦地 -打扫房间
倒垃圾 -/

对计算机:


def clean_room():
    clean_table()
    clean_floor()
    clean_trash()

形式参数

  • 给函数传入一些参数。

def clean_room(room_name):
    clean_table(room_name)
    clean_floor(room_name)
    clean_trash(room_name)

clean_room("主卧")
	

位置参数

  • 有多个形式参数,依据位置来赋值给参数。

def clean_room(room_name, level):
    # clean code
	
clean_room("主卧", 2)

关键字参数

  • 明确给一个参数赋值。

def clean_room(room_name, level):
    # clean code
	
clean_room(level = 2, room_name = "主卧")

默认参数

  • 对一个参数设置默认值。

def clean_room(room_name, level = 2):
    # clean code
	
clean_room(room_name = "主卧")

返回值


def clean_room(room_name, level = 2):
    # clean code
    finished = True
    return finished
	
success = clean_room(room_name = "主卧")

  • return 语句结束,函数也结束
  • 如果没有 return 语句,默认返回 None

多返回值

  • 用逗号分分隔多个返回值
  • 接收时也要用多个变量来接收返回值

def clean_room(room_name, level = 2):
    # clean code
    finished = False
    error_msg = "清洁剂没有了"  # error_msg, finished 是局部变量,只能函数内部使用
    return finished, error_msg
	
success, msg = clean_room(room_name = "主卧")

文档字符串


def clean_room(room_name, level = 2):
    '''这个函数用来清理房间
    '''
    # clean code  一般注释
    finished = False
    error_msg = "清洁剂没有了"
    return finished, error_msg

可变个参数

Python 部落搜索 args

*args 和 **kwargs 在 Python 中的作用

Python 基础 04-控制流

控制流

控制代码的执行顺序

For 循环就是一种控制流。

if 语句


if 条件一:
    语句块一
elif 条件二:
    语句块二
elif 条件三:
    语句块三
else:
    语句块四

各个条件是互斥的。


if score > 90:
    is_best = True    # 是优等生
elif score > 80:
    is_better = True  # 良
elif score > 60:
    is_ok = True      # 及格
else:
    Failed = True     # 不及格

continue 和 break 语句


now = [1, 2, 3, 4, 5]
for item in now:
    if item == 2:
        continue    # 跳过后面三句    
    if item == 4:
        break       # 跳出 for 循环  
    print item
	

while 语句


while 条件:
    # do something

只要条件为 True 就一直执行 停止办法:

  • 改变条件(while 内部),使得条件变为 False
  • 使用 break 强制退出

a = [1, 2, 3, 4, 5]
while len(a) > 0:
    if a[-1] == 4:
	    # continue  # 如果用 continue,则是死循环
        break
    else:
        print(a.pop())

Ref

Python 代码可视化执行过程

Python 基础 03-列表与 For 循环

列表:一排

  • [1, 2, 3]
  • [“a”, “b”, “c”]
  • [True, 1, “a”]

列表中的元素可以是相同的数据类型或不同的数据类型。

列表取值

a = [1, “a”, 3, 6, “google”]

  • a[0] -> 1
  • a[1] -> “a”
  • a[-1] -> “google”

给列表中的元素赋值,会改变列表元素的值,列表也会跟着改变。

列表分片

a[1:4] -> [“a”, 3, 6]

前闭后开的区间 [1, 4),分片不包含最后标识的列表元素。

列表添加删除值

a = [1, “a”, 3, 6, “google”]

  • insert 方法:在列表任意位置添加值 a.insert(0, “fir”) 第一个参数为要添加位置的标识
  • append 方法:在列表最后位置添加值 a.append(“ch”)
  • del 方法:删除列表任意位置的值 del a[2] 参数为要删除的列表元素位置标识
  • pop 方法:弹出列表中的最后一个元素

>>> a = [1, "a", 3, 6, "google"]
>>> a.insert(0, True)		# 添加列表元素
>>> a
[True, 1, 'a', 3, 6, 'google']
>>> a.append("123")			# 在列表最后位置添加值
>>> a
[True, 1, 'a', 3, 6, 'google', '123']

列表遍历

使用 for 循环


>>> a
[True, 1, 'a', 3, 6, 'google', '123']
>>> for item in a:
...     print(item)
...     print("..")
... 
True
..
1
..
a
..
3
..
6
..
google
..
123
..
	

Python 文件中 Python 代码的写法是标准的写法, 而 Python 命令行会将输入的每个语句的结果输出。

Python 基础 02-数值计算

Python 基础 02-数值计算

用 Python 做数值计算非常直观。

基础四则运算

  • 加法:1 + 2
  • 减法:9 - 7
  • 乘法:23 * 45
  • 除法:7 / 8
  • 乘幂:2 ** 3
  • 取整除:89 // 5

PS: “1 + 2” 和 “1+2” 等效,为了代码阅读美观,一般采用前一种形式。

Python 2 和 Python 3 的差异

  • 在 Python2 中: 7 / 2 == 3 , 即整数除以整数,得到的还是整数。这和 C 语言是一致的,是计算机的思维方式。
  • 在 Python3 中: 7 / 2 == 3.5 , 即整数除以整数,得到的是浮点数。这和人类的思维是一致的。

真假判断

  • 大于:1 > 2
  • 小于:9 < 7
  • 大于等于:23 >= 45
  • 小于等于:7 <= 8
  • 等于:2 == 3
  • 不等于:True != False

逻辑运算

  • not 条件:真假值反转,对应汉语中的“非”
  • 条件 A and 条件 B:A,B 均为真才真,对应汉语中的“而且”
  • 条件 A or 条件 B:A,B 中一个为即为真,对应汉语中的“或者”

运算顺序

可以通过括号改为运算顺序

运算表达式简写

  • a = a + 1 等价于 a += 1
  • a = a - 1 等价于 a -= 1

Ref

Python 运算符