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)
无返回值函数
- 没有
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))