1、前言
在每种语言中,总是会存在函数,那么为什么每种语言都有函数这个东西呢?
函数,简单的来说,是一种对程序在逻辑上进行结构化的一种编程方法,主要就是将需要解决的问题来进行抽象,来进行分解,从而达到代码复用的目的。
2、函数的基本概念
创建函数如下:
>>> def createFunction(x,y): ... return x+y函数对象或者函数引用如下:
>>> createFunction <function createFunction at 0x7f8bfb925488>
函数调用:
>>> createFunction(3,2) 5在函数的返回值方面有几个分类如下:
a、 当返回0个值也就是没有返回值的时候,返回的值为None
b、当返回值为1个的时候,返回值为object
c、当返回值大于1个的时候,返回值为一个tuple --当返回值为tuple的时候,可以进行解包,也就是unpack,如下:
>>> def returnaTuple(x): ... return x,3,4 ... >>> x,y,z = returnaTuple(1) #unpack操作,将返回值分别进行赋值 >>> x,y,z (1, 3, 4)
包括函数的形参:在函数中定义的参数,例如f(x)中的x表示为形参
在调用函数的实参:也就是在调用函数的时候传入的参数,例如multi(4,5)也就是实际参数
3、调用参数
在调用参数的时候,有几种特殊的参数需要注意,一个是元组,也就是非关键字参数;一个是字典,也就是关键字参数。
在进行调用的语法如下:
>>> def func(*tuple_nonkw_args,**dict_kw_args): ... pass ...a、 顺序问题:关键字参数必须位于非关键字后面否则会报错syntax error,如下所示:
>>> func(3,4,name='kel',4) File "<stdin>", line 1 SyntaxError: non-keyword arg after keyword argb、 关键字参数,必须是变量等于的形式,如下:
>>> func(3,4,'name'='kel') File "<stdin>", line 1 SyntaxError: keyword can't be an expressionc、 在字典做参数的时候:
在使用字典的时候,必须使用双星号,也就是**dict;可以使用关键字方法,例如name=‘kel’
>>> func(1,**dict) "(1,) {'name': 'kel'} " >>> func(1,name='kel') "(1,) {'name': 'kel'} " >>> <strong>func(1,dict) #在使用字典的时候,如果字典不用双星号进行标记,那么就会出现如下错误,将字典的值也传递给了tuple</strong> "(1, {'name': 'kel'}) {} "函数调用参数主要规则如下:
>>> def func(positional_args,keyword_args,*tuple_nonkw_args,**dict_kw_args): ... pass ...4、 在未声明不允许调用函数
在未进行声明的时候,不允许调用函数。
在声明的时候,顺序是可以改变的,只要在调用的时候,已经声明过了即可,如下:
>>> def foo(): ... print 'foo is called' ... bar() ... >>> def bar(): ... print 'bar is called' ... >>> foo() foo is called bar is called从上面例子可以看到,在定义函数foo的时候,并没有定义bar,但是函数定义成功
在调用函数foo的时候,bar函数已经声明了,从而可以正确执行
在python中,前向引用函数或者后向引用函数都是可以的,不会出现报错,但是在调用的时候,函数一定已经存在声明。
以下内容是从python核心编程中引出,如下:
#!/usr/bin/env python from operator import add,sub from random import choice,randint MAXTRIES = 2 #用来定义最大尝试次数 op = {'+':add,'-':sub} #主要用字典来定义使用的计算 def doprobe(): 'use to print the calculate math and the check result' nums = [randint(1,10) for i in range(2)] nums.sort(reverse=True) opera = choice('+-') oops = 0 pr = '%d %s %d ' %(nums[0],opera,nums[1]) #打印出来的计算式 answer = op[opera](*nums) #在此,直接使用字典来调用方法,并且直接将参数作为一个元组进行传入然后计算。 ans = '%d %s %d = %d' % (nums[0],opera,nums[1],answer) #计算结果 while True: try: print pr userinput = int(raw_input('answer is : ')) if userinput == answer: print 'correct' break elif oops == MAXTRIES: print ans else: print 'incorrect ,try again' oops += 1 except (KeyboardInterrupt,EOFError,ValueError): print 'invalid input ...try again' def main(): 'this is to sure continue the math' while True: doprobe() try: userchoice = raw_input('continue ? [y]/ [n]').lower() if userchoice and userchoice[0] == 'n': break except: print 'quit for math' break if __name__ == '__main__': main()
执行结果如下:
[root@python 419]# python easyMath.py 10 + 1 answer is : 11 correct continue ? [y]/ [n] 10 + 5 answer is : 12 incorrect ,try again 10 + 5 answer is : 13 incorrect ,try again 10 + 5 answer is : 1 10 + 5 = 15 10 + 5 answer is : 1 10 + 5 = 15 10 + 5 answer is : 15 correct continue ? [y]/ [n]n
在以上例子中:
主要使用两个方法来分割整个计算,在main中主要是用来做是否循环的询问,在doprobe函数中,主要是用来进行打印计算公式和计算结果。
在进行调用函数的时候,第一个是使用字典来实现case ,when的选择,第二个是在传递计算参数的时候,直接使用一个元组来调用参数。
在进行模块编写的时候,常量写在最上面,从而可以直接使用。