7. 函数

2018-08-14  本文已影响0人  WESTWALL

基于网络课程《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)

无返回值函数

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

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))
上一篇下一篇

猜你喜欢

热点阅读