本章内容
1、调用函数
2、定义函数
3、变量作用域
4、使用main函数
5、函数参数
6、模块
-----------------------------------
函数就是一块重复利用的功能代码,是一个有名称的代码模块。
1、调用函数
内置函数,pow(x,y),它计算的是x ** y,即x的y次方;
其中,pow 为函数名称,2 5 则是传递给函数的参数,返回值为 32。
函数如果没有输入值,也需要添加括号,如下图:
如果不加上括号,则提示这是一个功能模块;
一定要注意的是:函数名不能做变量名;如果使用了函数名做变量名,Python中也是不会报错的;此时,再去调用函数功能,就会报错,如下图:
2、定义函数
下面,我们自己定义一个函数--计算圆面积的函数(圆的面积为 πr²),代码如下:
# area.pyimport mathdef area(radius): """ Returns the area of a circle whith the given radius. For example: >>> area(5,5) 95.0.33177771091246 """ return math.pi * radius ** 2
此时,我们就可以像调用其他函数一样,调用这个 area 函数;
如果想要答应其中的帮助文档,我们可以使用__doc__参数:
函数的组成:
def 为函数头部;函数头部行,和if while 头部都一样,需要以 : 结尾;
函数头部后面定义的为函数名--area;
函数名括号里面为变量名--radius,它是指函数所需要输入的参数;
函数头部后面缩进的部分,全部称为函数体;
函数体中,一般需要定义函数的功能名称,这是一个不错的选着,也可以不写,但是一般建议描述上;
最后需要写入功能模块,也就是--“return math.pi * radius ** 2” 在return语句执行的时候,就可以跳出函数;
return同时可以用来返回 math.pi * radius ** 2 的值,radius值就是在函数头部行中,函数名括号中定义的输入参数;
函数并非必须包含return函数,但是如果没有,我们则认为函数结尾默认使用“return None”来做返回;如下面代码:
# hello.pydef say_hello_to(name): """ Prints a hello message. """ cap_name = name.capitalize() #capitalize() 功能在之间使用过,用来指定输入参数的首字母大写; print('Hello' + cap_name + ',how are you?')
4、变量的作用
函数带来一个重要的问题,就是作用域。变量的作用域指的是他在程序的那些地方可访问或可见。试看下面的程序:
# local.pyimport mathdef dist(x,y,a,b): s = (x -a) ** 2 + (y - b) ** 2 return math.sqrt(s)def rect_area(x,y,a,b): width = abs(x - a) heigth = abs(y - b) return width * height
首先,在函数内部定义的变量,我们叫做局部变量--s;而函数 rect_area 有两个局部变量 width 和 heigth;同时,函数的参数也被视为局部变量--x,y,a,b;
局部变量只能在当前函数模块中使用;
除了局部变量,我们还有全局变量。全局变量自然就是在整个代码中都会被使用到。例如下面的代码:
# global_error.pyname = 'Jack'def say_hello(): print('Hello ' + name + '!')def change_name(new_name): name = new_name
上面的代码中,包含来个函数模块,say_hello 和 change_name,而 name 变量则是在全局下生效的;
并且在 change_name() 函数中,又拥有name的局部变量,这时候,输入局部变量时候,依然会显示全局变量--Jack,所以,全局变量是优先于局部变量的;
所以,为了区分局部变量与全局变量,我们需要使用关键字global;
# global_correct.pyname = 'Jack'def say_hello(): print('Hello ' + name + '!')def change_name(new_name) global name #在这里,我们需要通过global参数,没来指定全局变量; name = new_name
运行结果如下:
4、使用main函数
main() 函数是作为所有函数的起点。例如在前面密码检查的代码中:
# password2.pydef main(): pwd = input('What is the password? ') if pwd == 'apple': print('Logging on ...') else: print('Incorrect password.') print('All done!')
所有的函数代码都位于mian()函数下面,我们需要运行 main() 来执行下面的代码;
5、函数的参数
给函数传递参数的时候,Python通过引用的方式来传递:
# reference.pydef add(a,b): return a + b
运行结果如下:
此时,x,y的值可以直接应用到函数中的a,b的值中去,这就叫引用的方式;
有时候,这种引用的方式会带来一些问题,例如如下代码:
# reference2.pydef set1(x): x = 1
此时,通过引用的方式将变量赋值为5,但是,在布局变量中 x 的值为1,但是输出依然为 m 原本对应的值 5 ,所以,在这种情况下,是没有实现变量引用的;
有时候,我们需要给函数指定默认值:
# greetings.pydef greet(name,greeting = 'Hello'): print(greeting,name + '!')
其中,定义了greeting = ‘Hello’ 为默认值。如果从新赋值,则会使用新的值;运行结果如下:
关键字参数:
在Python中,另外一种比较有用的参数指定方式是使用关键字。例如:
# shopping.pydef shop(where = 'store',what = 'pasta',howmuch = '10 pounds'): print('I want you to go to the' , where) print('and buy', howmuch , 'of' , what + '.')
运行结果如下:
6、模块
模块是一列相关的函数和变量组合起来的一个功能代码块;
它是一个 .py 的文件,直接在你的代码中调用这个 .py 的文件即可;用于在屏幕上打印形状的代码如下:
# shapes.py""" A collection of functions for printing basic shapes."""CHAR = '*'def rectangle(heght,width): """ Prints a rectangle.""" for row in range(height): for col in range(width): print(CHAR, end = '') print()def square(side): """ prints a square. """ rectangle(side, side) def triangle(height): """Prints a right triangle. """ for row in range(height): for col in range(1, row + 2): print(CHAR, end = '') print()
模块与常规Python程序的差别就是用途不同:模块是一个由函数组成的工具箱,用于编写其他程序。因此,模块通常没有mian()函数;
使用模块方式如下:
import shapesdir(shapes)print(shapes.__doc__)shapes.CHARshapes.square(5)shapes.triangle(3)form shapes import * #还可以导入模块的所有内容rectangle(3,8)
名称空间: