• python函数基础


    一、基础

    函数的定义

    def 函数名(参数):
        ...
        函数体
        ...
        返回值        #如果函数执行完毕也没有return语句时,自动return None。
    

    空函数

    如果想定义一个什么事也不做的空函数,可以用pass语句:

    def nop():
            pass()         #pass语句什么都不做,用来作为占位符。
    

    参数检查

    调用函数时,如果参数个数不对,Python解释器会自动检查出来,并抛出TypeError;如果参数类型不对,Python解释器无法检查,可通过内置函数isinstance()来实现。

    li = []
    ret = isinstance(li,list)
    print(ret)    #True
    

    返回值

    在python中根据返回对象的个数不同,返回结果的数据类型也不同

    返回对象的个数 返回类型
    0 NoneType
    1 取决于返回对象的数据类型
    >1 tuple
    def f1():
        return
    
    def f2():
        return True
    
    def f3():
        return 1,2,3
    
    print(type(f1()))   #<class 'NoneType'>
    print(type(f2()))   #<class 'bool'>
    print(type(f3()))   #<class 'tuple'>
    

    二、参数

    普通参数

    # ######### 定义函数 ######### # name 叫做函数func的形式参数,简称:形参def func(name):
        print name
    
    # ######### 执行函数 ######### 
    # 'morra' 叫做函数func的实际参数,简称:实参
    func('morra')
    

    指定形参传入实参

    def func(p, text, subject):
        ret = p + text + subject
        return ret
    
    print(func(subject="XXX", p="123", text="OK"))    ##使用该方法后不需要按顺序传入实参
    

    默认参数

    默认参数可以简化函数的调用,但是需要放在参数列表最后,并且必须指向不变对象。

    def func(name, age = 18):        #
        print "%s:%s" %(name,age)
    
    func('morra', 19)    # 指定参数
    func('hello')        # 使用默认参数
    

    动态参数一(可变参数)

    def func(*args):        #在形参前加*之后args变成动态参数,该参数的数据类型变成了tuple元组
        print(type(args))    #<class 'tuple'>
        print(args)    
    
    # 执行方式一
    func(11,33,4,4454,5)    #可传入数字、字符串、列表、元组等等
    
    # 执行方式二
    #这里需要注意一下,如果写func(*li) ,则表示把list转换为tuple再传入实参;如果写的是func(li)那么就表示把list当做tuple的元素()传入实参。
    li = [11,2,2,3,3,4,54]    
    func(*li)            
    
    
    

    动态参数二(关键字参数)

    def func(**args):        #在形参前加**之后,该参数的数据类型变成了dict字典
        print(type(args))    #<class 'dict'>print args
        print(args)   
    
    # 执行方式一
    func(name='morra',age=18)
    
    # 执行方式二
    li = {'name':'morra', age:18, 'gender':'male'}
    func(**li)               
    

    命名关键字参数

    用来限制传入关键字参数的名字

    def person(name, age, *, city, job):    #*不是参数,而是特殊分隔符       
        print(name, age, city, job)
    
    person('morra', 18, city='beijing', job='engineer')
    
    OUTPUT:
    morra 18 beijing engineer
    

    命名关键字参数必须传入参数名,否则会报错:

    def person(name, age, *, city, job):
        print(name, age, city, job)
    
    person('morra', 18, 'beijing', 'engineer')
    
    OUTPUT:
    Traceback (most recent call last):
      File "C:/test.py", line 6, in <module>
        person('morra', 18, 'beijing', 'engineer')
    TypeError: person() takes 2 positional arguments but 4 were given
    

    动态参数三(万能参数)

    def func(*args, **kwargs):
        print args
        print kwargs
    

    *参数定义的顺序

    必选参数 > 默认参数 > 可变参数/命名关键字参数 > 关键字参数

    三、补充

    三目运算:

    学习条件运算时,对于简单的 if else 语句,可以使用三元运算来表示,即:

    # ###################### 普通条件语句 ######################
    
    if 1==1 :
        name = "hello"
    else:
        name = "world"
    # ###################### 三目运算 ######################
    name = "hello" if 1==1 else "world"     
    print(name)
    

    lambda表达式

    对于简单的函数,也存在一种简便的表示方式,即:lambda表达式

    # ###################### 普通函数 ######################
    # 定义函数(普通方式)
    def func(arg):
        return arg + 1
        
    # 执行函数
    result = func(123)
        
    # ###################### lambda ######################
        
    # 定义函数(lambda表达式)
    my_lambda = lambda arg : arg + 1
        
    # 执行函数
    result = my_lambda(123)
    

    四、递归

    py标准的解释器没有针对尾递归做优化,因此任何递归函数都存在栈溢出的问题。

    练习

    # 利用递归函数计算阶乘
    # N! = 1 * 2 * 3 * ... * N
    def fact(n):
        if n == 1:
            return 1
        return n * fact(n-1)
    
    print('fact(1) =', fact(1))
    print('fact(5) =', fact(5))
    print('fact(10) =', fact(10))
    
    
    # 利用递归函数移动汉诺塔:
    def move(n, a, b, c):
        if n == 1:
            print('move', a, '-->', c)
            return
        move(n-1, a, c, b)        
        print('move', a, '-->', c)
        move(n-1, b, a, c)
    
    move(4, 'A', 'B', 'C')
    
    
    # 斐波那契数列
    def func(a, b):
        if a == 0:
            print(a, b)
        c = a + b
        print(c)
        func(b, c)
    
    func(0, 1)
    
  • 相关阅读:
    卡特兰数
    java学习
    最大化窗口
    C++复制文件的代码
    C++复制文件(使用WindowsAPI)
    C++下获取XMLHTTPRequest指针
    操作哈希表
    《Windows Communication Foundation之旅》系列之三(转载)
    让.Net2.0的Membership使用已存在的Sql Server2000/2005数据库
    用Visual C#做WinForm组件
  • 原文地址:https://www.cnblogs.com/whatisfantasy/p/5967283.html
Copyright © 2020-2023  润新知