在学习了一些Python3的基本语法知识后,下面尝试写一个斐波纳契数列。
# Fibonacci series: 斐波纳契数列
# 两个元素的总和确定了下一个数
a, b = 0, 1
while b < 10:
print(b)
a, b = b, a+b
其中代码 a, b = b, a+b 的计算方式为先计算右边表达式,然后同时赋值给左边(多变量赋值)
执行以上程序,输出结果为:
1
1
2
3
5
8
第一行包含了一个复合赋值:变量 a 和 b 同时得到新值 0 和 1。最后一行再次使用了同样的方法,可以看到,右边的表达式会在赋值变动之前执行。右边表达式的执行顺序是从左往右的。
键字end可以用于将结果输出到同一行,或者在输出的末尾添加不同的字符,实例如下:
# Fibonacci series: 斐波纳契数列
# 两个元素的总和确定了下一个数
a, b = 0, 1
while b < 1000:
print(b, end=',')
a, b = b, a+b
执行以上程序,输出结果为:
1,1,2,3,5,8,13,21,34,55,89,144,233,377,610,987,
在函数内部,可以调用其他函数。如果一个函数在内部调用自身本身,这个函数就是递归函数。
用递归函数求阶乘(例如:5!=5*4*3*2*1).代码如下:
def factorial(n):
if n==1:
return 1
else:
return n *factorial(n-1)
factorial(5)
执行以上程序,输出结果为:
120
使用递归函数需要注意防止栈溢出。函数调用是通过栈(stack)这种数据结构实现的,每当进入一个函数调用,栈就会增加一层栈帧,每当函数返回,栈就会减少一层栈帧。由于栈的大小是无限的,所以递归用的次数过多,就会导致栈溢出。
汉罗塔的移动也可以看做递归函数。
利用递归知识,遍历文件夹,打开每个文件夹,打印普通文件
import os
def func(filepath,n):
# 1.打开这个文件夹F:/untitled
files=os.listdir(filepath)
# 2.拿到untitled文件夹下的每个文件名
for file in files: #文件名
#3.获取路径
f_d=os.path.join(filepath,file) #F:/untitled/文件名 绝对路径
#4.判断是否是文件夹
if os.path.isdir(f_d):
#5.如果是文件夹 ,继续打开文件夹
print("\t"*n,file,":") #打印文件名
func(f_d,n+1)
else:#不是文件夹,普通文件
print("\t"*n,file)
func("F:/untitled",0)
打印结果:
.idea :
misc.xml
modules.xml
untitled.iml
workspace.xml
venv :
Include :
Lib :
site-packages :
easy-install.pth
pip-9.0.1-py3.7.egg :
EGG-INFO :
dependency_links.txt
entry_points.txt
pip :
basecommand.py
baseparser.py
cmdoptions.py
commands :
check.py
__init__.py
compat :
dictconfig.py
__init__.py
download.py
exceptions.py
...
例:我们都知道兔子的繁殖能力是惊人的,如下图:
编写代码,打印出20个月后兔子的总对数?
#斐波拉契数列
def fab(n):
if n<1:
print('输入有误')
return -1
if n==1 or n==2:
return 1
else:
return fab(n-1)+fab(n-2)
result=fab(20)
if result !=-1:
print('共有%d对小兔子诞生!' % result)
执行以上程序,输出结果为:
共有6765对小兔子诞生!