在上一篇文章中,我们介绍了 Python 的控制结构,现在我们介绍 Python 函数和模块。

查看上一篇文章请点击:https://www.cnblogs.com/dustman/p/9976234.html

函数和模块

代码重用
代码重用是编程语言里一个非常重要的概念,增加代码的大小会使维护变得更加困难。
在软件工程里,必须遵守不要编写同一代码的原则,英文 "Don't Repeat Yourself",简称:DRY 原则。
我们已经学习过一种方法通过使用循环来保证代码重用。在本节中我们将进一步探索两个模块:函数和

模块。

重复的代码被认为是遵循 WET 原则,即表示英语 Write Everything Twice 的缩写,或者 We Enjoy
Typing 的简写。

函数
到目前我们已经使用了不少的系统内置函数,函数调用就是左边是需要调用的函数名称,后面跟着圆括

号。

print("I like Python!")
range(0,10)
range(10,20,4)
str(12)
括号前面的单词是函数名,括号内以逗号分隔的值是函数参数

函数可以通过关键字 def 来定义。关键字后跟一个函数的标识符,接下来是一对圆括号,圆括号里可以
包括一些变量的名称,再以冒号结尾结束这一行后面缩进的语句块就是函数的一部分。
下面代码声明了一个 叫 func 的函数。当调用这个函数时打印 “Hello” 三次。

def func():
print("Hello")
print("Hello")
print("Hello") func()

运行结果:

>>>
Hello
Hello
Hello
>>>
所有函数的代码块都是通过缩进来定义的,函数名后面要跟随冒号。

函数调用必须在函数声明之后。如果调用在声明前,程序会发生异常。

func()
def func():
print("Hello")

运行结果:

>>>
NameError: name 'func' is not defined
>>>

函数参数
参数
函数名后面的括号是空的,意思是这个函数不需要参数。实际上,大多数函数都是有参数的。

def func(name):
print(name + "!") func("xmg")
func("dustman")
func("python")

运行结果:

>>>
xmg!
dustman!
python!
>>>
参数定义在圆括号里面。

同样,我们可以定义一个包含多个参数的函数,参数用逗号分隔开。

def func(x,y):
print(x + y)
print(x * y) func(2,7)

运行结果:

>>>
9
14
>>>

函数参数可以用作函数块定义中的变量,仅在函数体内部存在,不能在函数定义之外引用它们,同样这
也适用于在函数中创建的其他变量。

def func(x):
x += 1
print(x) func(5)
print(x)

运行结果;

>>>
6
NameError: name 'x' is not defined
>>>
从技术上讲,参数是函数定义中的变量,参数的值在调用时被函数复制了。

 函数返回值

我们见到一些内置函数比如 float 都返回一个值。要返回一个值,在函数体内部可以用 return 随时返
回函数结果。

def min(x,y):
if x <= y:
return x
else:
return y print(min(5,1))
z = min(5,8)
print(z)

运行结果:

>>>
1
5
>>>
return 语句不能在函数外面使用,函数执行完毕没有 return 语句时,函数自动产生 return None

定义一个函数,比较它的两个字符串参数的长度,返回长度长的那个参数。

def longer_string(x,y):
if len(x) >= len(y):
return x
else:
return y ret = longer_string('abcde','')
print(ret)

运行结果:

>>>
123456789
>>>

当从函数返回一个值,程序立即停止执行并返回,return 下面的代码不会执行。

def add(x,y):
sum = x + y
return sum
print("I won't be printed!") print(add(1,4))

运行结果:

>>>
5
>>>

备注和文档注释
备注
注释是代码的注解,用于是代码更容易理解,它们不影响代码的运行方式。
在 Python 中,注释是通过插入哈希符号 # 来实现的。该行在 # 之后的所有文本都被程序忽略。

x = 123
y = 456
# This is an annotation
print(x + y) # addition
# print(x * y)
# another comment

运行结果:

>>>
579
>>>

Python 没有多行注释,其他编程语言有多行注释功能,使用 /* */ 语法。
文档注释
文档注释有点和注释相同,因为它们是用来解释代码的。
但是文档注释说明更具体些,并且有不同于注释的语法。它们是通过在函数或类的第一行下面放置一个

包含多行字符串方式来创建的。

def main(word):
"""
this function is print a string
"""

print(word + "!") main("Hello world")

运行结果:

>>>
Hello world!
>>>
文档注释是字符串的另一种表现,运行时会被保留在程序或类里并能被用 __doc__ 变量读到。
文档注释一般给类和函数做注释,而单行注释一般用来说明某一行的功能。

函数即对象
函数
虽然它们创建与普通变量不同,但函数就像任何其他类型的值一样。可以将它们重新分配给变量,然后对引用调用。

def add(a,b):
return a + b x = 9
y = 9
obj = add
print(obj(x,y))

运行结果:

>>>
18
>>>
上面的例子将加法函数重新指派了一个变量名,现在我们可以用变量名来调用函数。

函数还可以被当做参数来调用

def multiply(a,b):
return a * b def more_again(func,a,b):
return func(func(a,b),func(x,y)) x = 9
y = 9
print(more_again(multiply,x,y))

运行结果:

>>>
6561
>>>
如上面例子所示,函数 multiply 函数被 more_again 当做参数并在函数体里面调用。

让函数 "square" 被函数 "my_func" 当作参数调用。

def square(a):
return a * a def my_func(func,x):
print(func(x)) my_func(square,67)

运行结果:

>>>
4489
>>>

模块
模块(Modules)是为完成常见任务而编写的代码,例如生成随机数、执行数字操作等。
模块最大的好处是大大提高了代码的可维护性。其次,编写代码不必从零开始。当一个模块编写完毕, 就可以被其他地方引用。使用模块还可以避免函数名和变量名冲突。

使用模块的基本方式是在代码的顶部添加 import module_name 代码,然后使用模块 module_name.var 访问模块中的变量名称的函数和值。

下面代码示例如何使用 random 模块生成乱数。

import random

for i in range(6):
num = random.randint(1,7)
print(num)

运行结果;

>>>
5
3
5
2
7
4
>>>
上面代码使用 random 模块中定义的 randint 函数在 1 到 7 的范围内打印 6 个随机数。

如果您只需要模块中的某些函数,可以使用另一种导入模块的方法。
采用 from module_name import var 的方式导入函数 var 后你就可以使用 var,就好像它是在代码中定义的一样。
下面代码示例程序仅需要 math 模块的 pi 常量。

from math import pi

print(pi)

运行结果:

>>>
3.141592653589793
>>>

使用逗号分隔列表可以导入多个函数。

from math import pi,cos
* 表示从模块里导入所有的函数,比如:from math import *
通常不鼓励这么做,因为它混淆了代码中的变量和外部模块中的变量。

导入不存在的模块名会导致 importError 错误。

import my_module

执行结果:

>>>
ModuleNotFoundError: No module named 'my_module'
>>>

可以使用 as 关键字以不同的命名来导入模块或对象,这可以用在模块或对象有一个长的或令人困惑的名称时。

from math import cos as my_cos
from math import pi
print(my_cos(pi))

运行结果:

>>>
-1.0
>>>

标准库和 pip
模块
Python 中有三种主要类型的模块:你自己编写的模块、从外部源安装的模块以及与 Python 一起预装的

模块。
预装的模块叫做标准库,包含一些常用的模块。标准库里包含的模块包括:
random,json,os,pdb,sys,re,string,math,subprocess,socket,email 和 doctest 等。
标准库可以完成的任务包括字符串解析、数据序列化、测试、调试和操作日期、电子邮件、命令行参数等等。

Python 的标准库拥有大量模块,这是它的主要优势之一。

标准库
一些标准库用 Python 写的,另外一些是使用 C 语言写的。
大多数的库在任何平台通用,但是一些库只能在 Windows 或 Unix 环境里才能使用。

我们的文章中不会覆盖到所有的标准库,因为标准库太庞大了。完整的标准库文档可以访问 www.python.org,上面有英语,法语和日语等各种版本。

在 Python 中安装第三方模块是通过 pip 这个工具完成的,此工具随着 Python 安装程序安装到你的机器。要安装的一个库,转到命令行(对于 Windows,它将是命令提示符),输入 pip install library_name。安装完成后就可以导入 library_name 这个模块并使用了。

使用 pip 这个工具是在大多数操作系统上安装第三方库的标准方法,有些库已经为 Windows 预先构建了二进制文件。这些是普通的可执行文件,也可以使用 GUI 安装库,就像安装其他程序一样。

注:请在命令行下输入 pip,不要在 Python 的解析器里。

“程序员有三种美德:懒惰,急躁和傲慢...”

Python学习手册之函数和模块的更多相关文章

  1. Python学习-第一天-函数和模块的使用

    目录 Python学习-第一天总结 print输出的一种简单格式 函数参数之可变参数 模块管理函数 if else语句的单行实现(简洁) 变量作用域 函数书写格式 Python学习-第一天总结 pri ...

  2. 《Python学习手册 第五版》 -第16章 函数基础

    前面的章节讲解的是一些基础数据类型.基本语句使用和一些文档查看的内容,这些都是一些基础,其实还谈不上入门,只有了解了函数,才算入门 函数是编程里面使用最多的也是最基本的程序结构, 本章重点内容 1.函 ...

  3. 《Python学习手册》读书笔记

    之前为了编写一个svm分词的程序而简单学了下Python,觉得Python很好用,想深入并系统学习一下,了解一些机制,因此开始阅读<Python学习手册(第三版)>.如果只是想快速入门,我 ...

  4. 《Python学习手册》读书笔记【转载】

    转载:http://www.cnblogs.com/wuyuegb2312/archive/2013/02/26/2910908.html 之前为了编写一个svm分词的程序而简单学了下Python,觉 ...

  5. global语句(python学习手册422页)

    # -*- coding: cp936 -*- #python 27 #xiaodeng #global语句(python学习手册422页) #实际上就是一个名为__builtin__的模块,但是必须 ...

  6. 《Python学习手册》(二)

    <Python学习手册>(二) --类型和运算 数字 十六进制 八进制 二进制 0x 0o 0b hex() oct() bin() >>>int('10',2) 2 & ...

  7. 参考学习《Python学习手册(第4版)》高清中文PDF+高清英文PDF+源代码

    看到第38章了,整体感觉解释详细,例子丰富:关于Python语言本身的讲解全面详尽而又循序渐进不断重复,同时详述语言现象背后的机制和原理:除语言本身,还包含编程实践和设计以及高级主题.边看边写代码.不 ...

  8. 读书分享全网学习资源大合集,推荐Python学习手册等三本书「01」

    0.前言 在此之前,我已经为准备学习python的小白同学们准备了轻量级但超无敌的python开发利器之visio studio code使用入门系列.详见 1.PYTHON开发利器之VS Code之 ...

  9. 《Python学习手册 第五版》 -第15章 文档

    本章主要介绍Python中的文档,会通过多种方式来说明,如果查看Python自带文档和其他参考的资料 本章重点内容 1.#注释:源文件文档 2.dir函数:以列表显示对象中可用的属性 3.文档字符串 ...

随机推荐

  1. Sharepoint学习笔记--如何定位网站集所在的w3wp进程

     我们在调试WebPart或者EventHandler之类的自定义组件时会遇到如何定位部署的网站集所对应的w3wp.exe进程的问题,方法如下 : 方法1. 直接开始运行,输入cmd,再输入iisap ...

  2. 深入JDK源码,这里总有你不知道的知识点!

    Java的基础知识有很多,但是我认为最基础的知识应该要属jdk的基础代码,jdk的基础代码里面,有分了很多基础模块,其中又属jdk包下面的lang包最为基础. 我们下面将总结和分析一下lang包下面最 ...

  3. 【Spring开发】—— AOP之方法级拦截

    前言: 前面介绍了Spring的核心模块以及相关的依赖注入等概念.这篇讲解一下spring的另一个重点,AOP面向切面编程. 说道AOP不得不提到几个概念: 切面:也就是我们自己的一些业务方法. 通知 ...

  4. 6 - 常用模块(os,sys,time&datetime,random,json&picle,shelve,hashlib)

    导入模块 想使用 Python 源文件,只需在另一个源文件里执行 import 语句 import module1[, module2[,... moduleN] from语句让你从模块中导入一个指定 ...

  5. March 1 2017 Week 9 Wednesday

    If you are serious giving up something, giving up is not serious at all. 如果你慎重地决定要放弃,那么放弃本身就没什么大不了的. ...

  6. BZOJ4566:[HAOI2016]找相同字符(SAM)

    Description 给定两个字符串,求出在两个字符串中各取出一个子串使得这两个子串相同的方案数.两个方案不同当且仅当这两 个子串中有一个位置不同. Input 两行,两个字符串s1,s2,长度分别 ...

  7. Python语言程序设计基础(3)—— 基本数据类型

    天天向上 dayup,dayfactor = 1.0,0.01 for i in range(365): if i % 7 in [6,0]: dayup = dayup*(1-dayfactor) ...

  8. Wannafly挑战赛1,2

    做了好久了,今天大佬讲题,好厉害,弱鸡只会几道水题. Treepath 给定一棵n个点的树,问其中有多少条长度为偶数的路径.路径的长度为经过的边的条数.x到y与y到x被视为同一条路径.路径的起点与终点 ...

  9. ACM-ICPC (10/16) Codeforces Round #441 (Div. 2, by Moscow Team Olympiad)

    A. Trip For Meal Winnie-the-Pooh likes honey very much! That is why he decided to visit his friends. ...

  10. 【翻译】苹果官网的命名规范之 Naming Properties and Data Types

    苹果官方原文:Naming Properties and Data Types 前言:纯属练习英语和学习.翻译错误和不通顺的地方敬请谅解和指正.O(∩_∩)O 属性和数据类型的命名 本节讲述了属性定义 ...