7. 函数

作者: WESTWALL | 来源:发表于2018-08-14 10:52 被阅读0次

    基于网络课程《Python全栈开发专题》 记录笔记,请支持正版课程

    斐波那契数列

    斐波那契数列科普:https://baike.baidu.com/item/%E6%96%90%E6%B3%A2%E9%82%A3%E5%A5%91%E6%95%B0%E5%88%97/99145?fr=aladdin

    从第三个数字开始,等于前两个数字之和。
    前两个数组相除,趋近黄金分割。

    def fibs(n):
        a = [1, 1]
        for i in range(n-2):
            a.append(a[-2] + a[-1])
        return a
            
    n = int(input('输入一个大于2的整数:'))
    myList = fibs(n)
    print(myList)
    
    # 打印一下看看
    for i in range(len(myList)):
        if i < 2:
            continue
        print('{} / {} = {:.6f}'.format(myList[i - 1], myList[i], myList[i - 1]/myList[i]))
    

    为函数创建文档注释

    def add(x, y):
        '''
    计算两个数的和
    我是谁我在哪
        '''
        return x + y
    
    def add1(x, y):
        '计算两个数的和'
        return x + y
    
    # 获取文档注释
    print(add.__doc__)  # 计算两个数的和
    print(50 * '=')
    print(add1.__doc__)  # 计算两个数的和
    print(50 * '=')
    
    # 直接打印文档注释
    help(add)
    

    无返回值函数

    • 没有return
    • return后面没有东西

    在函数内部修改变量的值(其实我是拒绝的)

    • 值传递:数值、字符串、布尔
    • 引用传递:(复合类型)列表、字典、对象
    myList = []
    
    def test(myList, x):
        myList.append(x)
        
    def test1(x):
        myList.append(x)
        
    print(myList)  # []
    test(myList, 'aaa')
    print(myList)  # ['aaa']
    test1('Bbbb')
    print(myList)  # ['aaa', 'Bbbb']
    

    Tips: dict() + zip()

    # 把两个list转换成字典
    list1 = ['name', 'age']
    list2 = ['zhangsan', 18]
    
    print(dict(zip(list1, list2)))   # {'name': 'zhangsan', 'age': 18}
    

    关键字参数

    def greet(name, greeting):
        return '问候语:{}, 姓名:{}'.format(greeting, name)
    
    # 常规操作
    print(greet('张三', '早上好'))
    # 关键字参数
    print(greet(greeting='早上好', name='张三'))
    
    '''
    混合使用位置参数和关键字参数
    1. 关键字参数必须在后面
    2. 同一个形参不同同时使用位置参数和关键字参数
    '''
    

    默认参数

    def fun(a, b, c=3):
        return a + b + c
    
    print(fun(1, 2))
    print(fun(1, 2, 1))
    print(fun(1, 2, c=1))
    

    可变参数

    def printParams(*params):
        print(params)
    
    printParams(1, 2, 3)
    '''
    可变参数在函数内部是以元组的形态存在
    '''
    
    print('------------------------')
    
    def printParams1(*params):
        for param in params:
            print('<' + str(param) + '>', end = ' ')
        print()列表/元组""; 字典"*"
    列表/元组""; 字典"*"
    printParams1(1, 'Tom', True)
    
    print('------------------------')
    
    def printParams2(value, *params):
        print(value)
        for param in params:
            print('<' + str(param) + '>', end = ' ')
    
    printParams2('独立的参数', 1, 'Tom', False)
    
    print('------------------------')
    
    '''
    如果可变参数不再最后,需要使用关键字参数
    '''
    def printParams3(*params, value):
        print(value)
        for param in params:
            print('<' + str(param) + '>', end = ' ')
            
    printParams3('独立的参数', 1, 'Tom', False, value="我才是命名参数")
    

    把序列中每个值都作为单独的参数传入函数

    列表/元组"*"; 字典"**"

    def printParams(s1, s2):
        print(s1, s2)
    
    def printParams1(*ss):
        for obj in ss:
            print('<{}>'.format(obj), end = ' ')
    
    def printParams2(**ss):
        for item in ss.items():
            print('{} = {}'.format(item[0], item[1]))
    
    printParams('Hello', 'World')
    
    strList = ['Hello', 'World']
    # 传参时,在列表前面加*号
    printParams(*strList)
    print()
    printParams1(*strList)
    print()
    printParams1(*'abcde')
    print()
    printParams1(*[1, 2, 3, 4])  # 元组一样
    print()
    printParams2(**{'a': 10, 'b': 20})  # 字典是 **
    

    函数的作用域

    m = 10
    
    def fun():
        m = 100
        def fun1():
            print(m)
        return fun1
    
    # 函数的作用域: 输出100
    fun()()   # fun() 返回的是函数fun1的指针,双括号调用
    

    函数的递归

    阶乘和菲波那切数列

    # 阶乘
    def jc(n):
        if (n == 1 or n == 0):
            return 1
        return n * jc(n-1)
    
    print(jc(3))
    
    # 菲波那切数列: 数列的第n个值
    def fb(n):
        '''
    求菲波那切数列的第n个元素的值
        '''
        if n == 0:
            return 0
        elif n == 1:
            return 1
        else:
            return fb(n - 1) + fb(n - 2)
    
    for n in range(20):
        print(fb(n), end = ' ')
    

    练习1:输入数列进行排序

    def sortNumbers(*numbers, type='asc'):
        '''
        输入一组数字,排序。
        type为排序方案(升序、降序)
        '''
        if type == 'asc':
            return sorted(numbers)
        elif type == 'desc':
            return sorted(numbers, reverse=True)
    
    numbers = [5, 8, 1, 9]
    
    print(sortNumbers(*numbers))
    print(sortNumbers(*numbers, type='desc'))
    

    练习2:二分法查找元素

    def search(sequence, number, lower = 0, upper = None):
        
        if upper is None: upper = len(sequence) - 1
        
        # 终止条件
        if lower == upper:
            if number == sequence[upper]:
                return upper
            else:
                return -1
        else:
            middle = (lower + upper) // 2  ## 整除
            # 要查找的值在右半部分
            if number > sequence[middle]:
                return search(sequence, number, middle + 1, upper)
            else:
                return search(sequence, number, lower, middle)
    
    # 测试
    myList = [1, 15, 6, 7, 19, 34, 99]
    sortedList = sorted(myList)
    print('排序列表: ', sortedList)
    print(search(sortedList, 7))
    

    相关文章

      网友评论

          本文标题:7. 函数

          本文链接:https://www.haomeiwen.com/subject/jeusdftx.html