函数通过def关键字定义。def关键字后跟一个函数的标识符名称,然后跟一对圆括号。圆括号之中可以包括一些变量名,该行以冒号结尾。接下来是一块语句,它们是函数体。

函数的基本概念


1 位置:从左往右进行匹配(默认方式) 
2 关键字参数:通过参数名进行匹配
   func(name = value)
3 默认参数:为没有传入值的参数定义参数值
   def func(name = value)
4 打包参数:(函数)收集任意多参数位置参数def func(*name)或关键字参数def func(**name) 
5 解包参数:(调用者)传递任意多(位置/关键字)参数位置参数func(*name)或关键字参数func(**name) 
在不能预测将要传入参数的数目时,是很方便的,如min()

def是可执行语句 在if语句、while循环中甚至是其他的def中嵌套是合法的 
if test: 
     def func():     ... 
else: 
     def func():     ... 
func()
def创建了一个函数对象,并将其赋值给一个变量名 函数对象可以赋值给其他的变量名,保存在列表中 
othername = func 
othername()
参数传递:通过将对象赋值给本地变量来实现 不可变参数是通过“值”进行传递 
可变参数是通过“指针”进行传递
模拟输出参数(“通过引用进行调用”的参数传递) def multiple(x,y):...;return x,y; 
X,L = multiple(X,L)
避免可变参数的修改

如果不想要函数内部在原处的修改影响传递给它的可变对象:
传递拷贝L = [1,2];changer(X,L[:])
或者def changer(a,b): b = b[:];... 
或者L = [1,2];changer(X,tuple(L))
参数匹配方式
函数可以通过lambda表达式创建  
yield语句  

作用域的基本概念


global并不是类型的声明,而是命名空间的声明 
全局变量在函数内被赋值,必须经过声明 
global X;X += 1
或者import thismod;thismod.X += 1全局变量名在函数的内部引用,可以不经过声明一个模块文件一旦被导入了,其全局变量也就变成了这个模块对象的一个属性:导入者自动得到了全局变量的访问权。但是别直接修改另一个文件中的变量。 
文件间进行通信的最好办法是通过调用函数,传递参数,然后得到返回值。可以使用accessor函数管理这种变化。
# first.py
X = 99def setX(new)
    global X
    X = new
# second.py

函数内部被赋值的变量名,默认为本地变量 赋值操作:=语句,import语句,def语句,参数传递 
L.append(X)并不会将L划分为本地变量,而L = X却可以
global声明了一个模块级的变量并被赋值
委任一个单个模块文件去定义所有的全局变量 全局变量的值取决于函数调用的顺序,而函数自身是任意顺序进行排列的,会引发问题,
最小化文件间变量的修改

函数定义


写在文件中没有问题:

不过在交互式中新手会。。。

函数形参


参数在函数定义的圆括号对内指定,用逗号分割。

(虽然一直很想要这样的字符串处理方式!但是作为一个C++程序员,不太习惯不打括号改打冒号,并且真心每次都很想打分号= =)

局部变量


在函数内改变局部变量x的值的时候,在主块中定义的x不受影响。结果:

使用global语句


如果你想要为一个定义在函数外的变量赋值,那么你就得告诉Python这个变量名不是局部的,而是 全局 的。我们使用global语句完成这一功能。没有global语句,是不可能为定义在函数外的变量赋值的。

使用global语句可以清楚地表明变量是在外面的块定义的。结果:

可以使用同一个global语句指定多个全局变量。例如global x, y, z

默认参数值


可以在函数定义的形参名后加上赋值运算符(=)和默认值,从而给形参指定默认参数值。默认参数值应该是不可变的。

如果我们不提供一个值,那么默认地,字符串将只被打印一遍。

关键参数


如果你的某个函数有许多参数,而你只想指定其中的一部分,那么你可以通过命名来为这些参数赋值——这被称作 关键参数 ——我们使用名字(关键字)而不是位置(我们前面所一直使用的方法)来给函数指定实参。

这样做有两个优势:

  1. 由于我们不必担心参数的顺序,使用函数变得更加简单了。
  2. 假设其他参数都有默认值,我们可以只给我们想要的那些参数赋值。

return语句


注意,没有返回值的return语句等价于return NoneNone是Python中表示没有任何东西的特殊类型。例如,如果一个变量的值为None,可以表示它没有值。除非你提供你自己的return语句,每个函数都在结尾暗含有return None语句。

通过运行print someFunc(),你可以明白这一点,函数someFunc没有使用return语句,pass语句在Python中表示一个空的语句块。

DocStrings


Python有一个很奇妙的特性,称为 文档字符串 ,它通常被简称为 docstrings。DocStrings是一个重要的工具,由于它帮助你的程序文档更加简单易懂,你应该尽量使用它。你甚至可以在程序运行的时候,从函数恢复文档字符串!

在函数的第一个逻辑行的字符串是这个函数的 文档字符串 。注意,DocStrings也适用于模块,我们会在后面相应的章节学习它们。

文档字符串的惯例是一个多行字符串,它的首行以大写字母开始,句号结尾。第二行是空行,从第三行开始是详细的描述。 强烈建议你在你的函数中使用文档字符串时遵循这个惯例。

你可以使用__doc__(注意双下划线)调用printMax函数的文档字符串属性(属于函数的名称)。

请记住Python把 每一样东西 都作为对象,包括这个函数。

我们会在后面的一章学习更多关于对象的知识。

如果你已经在Python中使用过help(),那么你已经看到过DocStings的使用了!它所做的只是抓取函数的__doc__属性,然后整洁地展示给你。

你可以对上面这个函数尝试一下——加上语句help(printMax):

自动化工具也可以以同样的方式从你的程序中提取文档。因此,我 强烈建议 你对你所写的任何正式函数编写文档字符串。随你的Python发行版附带的pydoc命令,与help()类似地使用DocStrings。

from: http://www.cnblogs.com/wei-li/archive/2012/03/24/2415728.html

简明python教程 --C++程序员的视角(二):函数及作用域的更多相关文章

  1. 简明python教程 --C++程序员的视角(一):数值类型、字符串、运算符和控制流

    最初的步骤 Python是大小写敏感的 任何在#符号右面的内容都是注释 >>> help('print')在“print”上使用引号,那样Python就可以理解我是希望获取关于“pr ...

  2. 简明python教程 --C++程序员的视角(九):函数式编程、特殊类方法、测试及其他

    函数式编程 Lambda exec,eval和assert语句,repr函数   lambda语句 用来创建简短的单行匿名函数 print_assign = lambda name, value: n ...

  3. 简明python教程 --C++程序员的视角(三):模块

    模块和包 1 python程序由包(package).模块(module)和函数组成.包是由一系列模块组成的集合.模块是处理某一类问题的函数和类的集合.函数是一段可以重复多次调用的代码. 2 pyth ...

  4. 简明python教程 --C++程序员的视角(四):容器类型(字符串、元组、列表、字典)和参考

    数据结构简介 Python定义的类型(或对象)层次结构在概念上可以划分为四种类别:简单类型.容器类型.代码类型 和内部类型. 可以将 PyObject 类之下的所有 Python 类划分为 Pytho ...

  5. 简明python教程 --C++程序员的视角(八):标准库

    os模块 这个模块包含普遍的操作系统功能. 如果你希望你的程序能够与平台无关的话,这个模块是尤为重要的.一个例子就是使用os.sep可以取代操作系统特定的路径分割符. os.system() 执行li ...

  6. 简明python教程 --C++程序员的视角(七):异常

    当你的程序中出现某些 异常的 状况的时候,异常就发生了.例如,当你想要读某个文件的时候,而那个文件不存在.或者在程序运行的时候,你不小心把它删除了.上述这些情况可以使用异常来处理. 假如你的程序中有一 ...

  7. 简明python教程 --C++程序员的视角(六):输入输出IO

    程序与用户交互 你会从用户那里得到输入,然后打印一些结果.我们可以分别使用raw_input,input和print语句来完成这些功能.raw_input会返回字符串,而input会返回字面值,相当于 ...

  8. 简明python教程 --C++程序员的视角(五):面向对象的编程

    面向对象的编程 在大多数时候你可以使用过程性编程,但是有些时候当你想要编写大型程序或是寻求一个更加合适的解决方案的时候,你就得使用面向对象的编程技术. 对象可以使用普通的属于对象的变量存储数据.属于一 ...

  9. 【转】简明 Python 教程

    原文网址:http://woodpecker.org.cn/abyteofpython_cn/chinese/ 简明 Python 教程Swaroop, C. H. 著沈洁元  译www.byteof ...

随机推荐

  1. BZOJ2330 糖果题解 查分约束

    BZOJ 2330 糖果题解 差分约束系统 + SPFA 题目传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=2330 Description ...

  2. URAL 1119. Metro(DP)

    水题. #include <cstring> #include <cstdio> #include <string> #include <iostream&g ...

  3. 李洪强iOS经典面试题129

    1. 怎么解决缓存池满的问题(cell) ios中不存在缓存池满的情况,因为通常我们ios中开发,对象都是在需要的时候才会创建,有种常用的说话叫做懒加载,还有在UITableView中一般只会创建刚开 ...

  4. [LintCode] Sort Integers 整数排序

    Given an integer array, sort it in ascending order. Use selection sort, bubble sort, insertion sort ...

  5. Displaying a full list of groups in Odoo's Kanban view

    Kanban view is probably the most flexible view in Odoo. It can be used for many different purposes. ...

  6. Java web MVC开发模式入门感悟

    当我进行第一个完整的java web项目的开发时,对以前所学的Java web知识体系有了一个清晰的进阶认识.我觉得非常有必要对此进行必要的总结. MVC,意指model(数据持久层)+viewer( ...

  7. SQL server 语言基础

    数据库: 1. 结构化查询语言(Structured Query Language)简称SQL: 数据库管理系统(Database Management System)简称DBMS: 数据库管理员(D ...

  8. 初始化char指针--赋值和strcpy() 本质区别【转】

    原文地址:http://hi.baidu.com/todaygoodhj/item/0500b341bf2832e3bdf45180 使用常量字符串初始化char指针,或者使用strcpy复制,从语法 ...

  9. strcat、strcpy、memcpy 的使用注意

    char *p = "hello";//5 个长度 ; //char *str = (char *)malloc(sizeof(char)*len); ] = "niha ...

  10. Unity学习疑问记录之layer问题

    在Sprite Render中有个Sorting Layer,这里可以建层,而Inspector窗口中也有个layer,也可以新建层,这2者有什么不一样呢? layer主要通过光线投射来选择性地忽略碰 ...