【原创】Python初体验之基础篇(3)- 函数

文 | 书心

今天更新的内容是python的函数部分,该部分设计的内容包括以下内容:

  • 函数定义
  • 作用域
  • 函数参数
  • 模块

1 函数定义

    python中函数定义使用关键字def,然后接函数名、参数列表,最后是一个冒号“:”,定义方式如下:

1 # 函数定义方式
2 
3 def func-name(args):
4   ...

    函数名和变量名一样,由数字、字母和下划线组成,不能以数字开头

1.1 函数副作用

    另外一个概念就是“函数副作用”,函数副作用是指除返回值外,函数以其他任何方式所作的修改称为副作用。打印到屏幕、文件和下载网页都属于副作用。这个概念是在“函数式编程”中所产生的概念,函数式编程认为函数不应该产生任何副作用。

 

1.2 作用域

    作用域是指程序能访问到的变量范围。在函数内部定义的变量是属于函数的局部变量,作用域是函数体,也即在函数体外是不可以访问到函数内部定义的变量的。

根据作用域的不同,变量分为局部变量和全局变量,全局变量必须使用关键字global。如 global name。

1.3 main函数

     在C++、java这些语言中,必须定义main函数作为程序的入口,而在python中main并不是作为程序的入口,python代码写在文件中,可以直接编译运行。通常在程序中应该使用main函数,这样可以更轻松的反复运行程序,还可以传递输入值。函数都有此优点。

1.4 函数参数

     Python采用按“引用传递”的方式。其实此处的引用传递和C++里的引用不是一个概念。C++中的引用是变量的别名,引用即代表变量本身。

1.4.1 基本内置类型参数

    Python中的引用则相当于C++中的值传递方式,编译器在实参传递时,临时生成一个中间变量来指向该值,而在函数内部对变量所作的任何修改,也只是对中间变量的修改,函数结束后,原变量的值没有发生改变。在pythonV3.5.1版中,运行一下代码,观察运行结果,即可理解这一概念。

 1 # 基本内置类型作参数
 2 
 3 def changeVal(var):
 4   try:
 5     var = int(var) + 10
 6   except:
 7 print("Error")
 8 >>> a = 10
 9 >>> changeVal(a)
10 >>> a
11 10

    从输出结果可以看到,传入的参数在函数内的修改,实际并没有更改变量实际指向的值。

1.4.2 复杂类型参数

    对于list等这类的参数,参数按引用方式传递,函数内部生成一个中间变量指向该变量。而这类变量是可变的,因此修改就是对变量本身做的更改。下面的代码即可验证。

 1 # 复杂类型做函数参数
 2 
 3 def changeListVal(lst):
 4    try:
 5      lst[0] = 100
 6    except:
 7      print("Error")
 8 
 9 >>> lst = [10, 20]
10 >>> changeListVal(lst)
11 >>> lst
12 [100, 20]

    在python中参数也可以有默认值,该用法和C++中类似。在以下的例子中简单举例说明函数参数默认值。

1 # 带默认值的函数参数
2 
3 def greeting(name, greetstr="Hello"):
4   print(greetstr, name+'!')
5 
6 >>> greeting(‘Bob’)
7 Hello Bob!
8 >>>greeting(‘Bob’, ‘HELLO’)
9 HELLO Bob!

2 模块

    模块是指一个.py文件中所有的函数及语句。模块中通常没有main函数,而由函数组成的一个工具箱,用于其它程序方便调用。

    模块的另外一个重要作用是它形成一个名称空间,名称空间基本就是一组独特的变量名和函数名。要让外面的函数可以调用模块内的函数,必须使用import语句。

    由于有了名字空间,不同模块之间就可以定义相同的函数而不会导致名字冲突。

 

 3 总结

    本章讲述的是python函数的基本内容,后续再对函数做更进一步的深入研究和学习, 如图3-1。

图3-1 本章基本知识点

 

posted on 2016-03-28 21:55  书心  阅读(206)  评论(0)    收藏  举报

导航