zoukankan      html  css  js  c++  java
  • 关于函数的总结之一

    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 arg
    b、 关键字参数,必须是变量等于的形式,如下:

    >>> func(3,4,'name'='kel')
      File "<stdin>", line 1
    SyntaxError: keyword can't be an expression
    c、 在字典做参数的时候:

    在使用字典的时候,必须使用双星号,也就是**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的选择,第二个是在传递计算参数的时候,直接使用一个元组来调用参数。

    在进行模块编写的时候,常量写在最上面,从而可以直接使用。








  • 相关阅读:
    paramiko模块
    linux 文件权限管理
    itext 生成pdf文件添加页眉页脚
    Python3 断言
    net core WebApi——文件分片上传与跨域请求处理
    Linux配置部署_新手向(二)——Nginx安装与配置
    Linux配置部署_新手向(一)——CentOS系统安装
    net core Webapi基础工程搭建(七)——小试AOP及常规测试_Part 2
    net core Webapi基础工程搭建(六)——数据库操作_Part 2
    net core Webapi基础工程搭建(七)——小试AOP及常规测试_Part 1
  • 原文地址:https://www.cnblogs.com/kellyseeme/p/5525042.html
Copyright © 2011-2022 走看看