函数基础与递归

函数是一系列常被重复使用的语句被抽取成一个"集合体",每次调用这个函数就相当于调用了这些语句,这样总体的代码函数会大幅降低。

例1:打印列表各元素值

a = list("python")
i = 0
while i < len(a):
print a[i]
i = i + 1
b = [1, 3, 4, 6]
i = 0
while i < len(b):
print b[i]
i = i + 1
c = range(1, 11)
i = 0
while i < len(c):
print c[i]
i = i + 1

从上边的例子可以看出,程序主要有3个列表a、b、c并打印了这三个列表里的数据,但代码行数较多,也不利于对程序的理解,其实可以将
i = 0
while i < len():
print
i = i + 1

抽象成函数printList,实际使用printList函数时是针对每个不同的列表来使用的,每次都打印不同的列表,那么每次打印的内容,可以作为printList函数的参数,传给printList函数,传入的不同内容即实现打印不同的内容,因此函数既有要做的事情即函数体(语句块),还要有处理对象(参数)。

1 定义函数

自定义定义函数的语法格式:
def 函数名(参数列表):
语句块

需要注意作为函数的语句,前需要按Tab键进行缩进对齐,没有按Tab缩进对齐的语句不属于该函数。

例2:printList函数的实现

def printList(x):
i = 0
while i < len(x):
print x[i]
i = i + 1

在定义好了函数之后,原来的"例1"的程序可以改成如下的样子。

#coding:utf-8

定义函数printList、x为参数(形参)

def printList(x):
i = 0
while i < len(x):
print x[i]
i = i + 1
a = list("python")

函数printList的调用,a为实参

printList(a)
b = [1, 3, 4, 6]
printList(b)
c = range(1, 11)
printList(c)

这样的程序及结构是不是清晰一些了呢?

2 全局和局部变量

函数体里的变量是局部的,可以在函数内部使用,而函数体外部的变量是全局的,可以在函数体内部访问(读),但如果想在函数内部修改全局变量得先用global声明一下要修改的全局变量。

x = 12
def m():
global x
x = 13
print x
m()
print x

如果函数里没有对某变量global进行声明就修改全局变量的值,程序会视为函数有和全局变量同名的局部变量,那么同名的全局变量对本函数不可见。

x = 12
def m():
#global x
x = 13
print x
m()
print x

3 递归

递归,函数定义里使用了函数本身。一般会使用if_else结构控制递归的进入和退出。

例3:求n!(n的阶乘)

用递归很容易,求解n!的数学过程如下所示,需要注意的是0!和1!都为1。
s0 = 1
s1 = 1 * s0
s2 = 2 * s1 = 2 * 1
s3 = 3 * s2 = 3 * 2 * 1
....
sn = n * s(n-1) = n * (n - 1) * .... * 2 * 1

可以用while循环来实现。

def Factorial(x):
i = 1
s = 1
while i <= x:
s = i * s
i = i + 1
return s
print Factorial(5)

也可以用递归来实现。

def Factorial(x):
if x == 0: # 终止、退出
return 1
else:
return x * Factorial(x - 1) #递归进入
print Factorial(3)

例4:利用递归实现正序打印列表

s = "python"
def printS(x, index):
if index < len(s):
print x[index],
printS(x, index + 1)

printS(s, 0)

相关推荐
无垠的广袤3 分钟前
【工业树莓派 CM0 NANO 单板计算机】本地部署 EMQX
linux·python·嵌入式硬件·物联网·树莓派·emqx·工业物联网
lkbhua莱克瓦244 分钟前
集合进阶8——Stream流
java·开发语言·笔记·github·stream流·学习方法·集合
20岁30年经验的码农23 分钟前
Java Elasticsearch 实战指南
java·开发语言·elasticsearch
雾岛听蓝27 分钟前
C++ 类和对象(一):从概念到实践,吃透类的核心基础
开发语言·c++·经验分享·笔记
CoderYanger35 分钟前
优选算法-优先级队列(堆):75.数据流中的第K大元素
java·开发语言·算法·leetcode·职场和发展·1024程序员节
TracyCoder1231 小时前
MySQL 实战宝典(八):Java后端MySQL分库分表工具解析与选型秘籍
java·开发语言·mysql
非凡的世界1 小时前
为什么我和越来越多的PHP程序员,选择了 Webman ?
开发语言·php·workman·webman
艾莉丝努力练剑1 小时前
【Python基础:语法第一课】Python 基础语法详解:变量、类型、动态特性与运算符实战,构建完整的编程基础认知体系
大数据·人工智能·爬虫·python·pycharm·编辑器
MarkHD1 小时前
车辆TBOX科普 第45次
java·开发语言
gCode Teacher 格码致知1 小时前
Python基础教学:如何拼接字符串?-由Deepseek产生
python