函数是组织好的、可重复使用的、用来实现单一或相关联功能的代码段。函数能提高应用的模块性,和代码的重复利用率。
python 提供了许多内建函数,比如 print(), max();
python 提供的大量内建函数,可以满足绝大多数基本的功能,有时候 python 语言是瑞士军刀,就是这个意思。
函数可以大大简化重复代码,降低工作量,减少错误。
函数的基本语法
def 函数名称( 参数 ):
函数语句
return [值]
虽然 Python 内置了大量函数,但是大多数提供的是基本功能,有时候还是不能满足真正程序的需要; 函数可以做的很复杂,发展为包(Package)。Python 目前有七万多个各类功能的包,几乎都可以可以免费使用在自己的程序中,这是最近几年 Python 飞速发展的原因之一。 学会使用函数来简化程序之后,可以为以后学习面向对象的编程方法打好基础,也可以真正的开始使用 Python 来解决各类问题。
2017年编写这个文档的时候,python 有大约7万多个包,现在,2020年4月,我看了一下 pypi,python 包的大本营,目前有 23万个包了。
In [4]:
# 计算圆的面积
# 不用函数的话,每次需要写一些重复的代码
r1 = 4
r2 = 6
r3 = 5.61
s1 = 3.14 * r1 * r1
s2 = 3.14 * r2 * r2
s3 = 3.14 * r3 * r3
print(s1)
print(s2)
print(s3)
In [5]:
# 定义一个函数,用来计算圆面积
# 输入 半径,返回 圆面积
def func1(r):
s = 3.14 * r * r
return s
print(func1(4))
print(func1(6))
print(func1(5.61))
In [8]:
# 先来看看 python 内置的获取最大值的函数
print(max(1,5))
print(max(1,4,6,3,9))
In [1]:
# 请注意,函数体内部的语句在执行时,一旦执行到return时,函数就执行完毕,并将结果返回。
# 因此,函数内部通过条件判断和循环可以实现非常复杂的逻辑。
# 从优雅的写法来说,不是很推荐一个函数内有多个返回点的方式,但是有时候这样写的确很方便
def my_max(a,b):
if a > b:
return a
else:
return b
print(my_max(3,6))
如果上面的函数要修改只有一个 return 应该怎么修改呢?
In [2]:
# *number 这样的写法,可以理解为传入任意数目个参数,包括0个参数,就是在参数名称前面加上一个 *
# 为了简化程序逻辑,返回的结果现在是假的
def my_max(*number):
print(number)
return 100
print(my_max(1,5,30,14,25))
In [3]:
# 用列表来排序,来完成这个取得任意值的最大值的函数
def my_max(*number):
a_list = list(number)
a_list.sort()
a = a_list[-1]
return a
print(my_max(1,5,30,14,25))
In [2]:
# Python的函数返回多值其实就是返回一个tuple,但语法上可以省略括号,写起来更方便
# 同时返回最大值和最小值
def my_max_min(*number):
a_list = list(number)
a_list.sort()
my_max = a_list[-1]
my_min = a_list[0]
return my_max, my_min
print(my_max_min(1,5,30,14,25))
In [4]:
# 判断奇偶数
a = int(input('Input a number:'))
def oushu():
if int(a/2) == a/2:
return True
#print('这是个偶数')
else:
return False
#print('这是个奇数')
result = oushu()
print(result)
In [1]:
# 判断元音
def yuanyin(s):
b = ['a','e','i','o','u']
c = 0
for i in list(a):
if i in b:
# c=c+1 的简约写法
c += 1
return c
a = input('plese input a word:')
print(yuanyin(a))
In [5]:
# 找到最大数 #1
def find_max(list1):
# max = float('-inf') 表示负无穷大
max = float('-inf')
for x in list1:
if x > max:
max = x
return max
print(find_max([-20,1,6,7,20,5]))
print(find_max([-20,-3,-6,-7,-5]))
In [6]:
# 找到最大数 #2
# 使用递归,递归是编程中非常有效的一种解决问题的方式,将内在逻辑分解为一个固定的逻辑,而调用参数来自于上一次的执行结果
# 使用递归要注意初始化和防止递归陷入死循环
# 排序、斐波那契数列这些都是递归的经典实现
def find_max(list1):
if len(list1) == 1:
return list1[0]
v1 = list1[0]
v2 = find_max(list1[1:])
if v1 > v2:
return v1
else:
return v2
print(find_max([1,6,7,20,5]))
In [ ]:
# 简单的剪刀石头布
import random
FIRST = 0
SECOND = 1
BOTH = 2
t1 = ('剪刀', '石头', '布')
t2 = ('human win', 'computer win', 'draw')
def which_win(i1, i2):
if i1 == 0 and i2 == 1:
return SECOND
if i1 == 0 and i2 == 2:
return FIRST
if i1 == 1 and i2 == 0:
return FIRST
if i1 == 1 and i2 == 2:
return SECOND
if i1 == 2 and i2 == 0:
return SECOND
if i1 == 2 and i2 == 1:
return FIRST
if i1 == i2:
return BOTH
print('0:剪刀 1:石头 2:布')
human = int(input('你出了:'))
c_index = random.randint(0,2)
computer = t1[c_index]
print("电脑出了",computer)
print(t2[which_win(human, c_index)])
In [ ]:
# 优化的剪刀石头布程序
import random
FIRST = 0
SECOND = 1
BOTH = 2
t1 = ('scissors', 'stone', 'cloth')
t2 = ('human win', 'computer win', 'draw')
table = {'01':1, '02':0, '10':0, '12':1, '20':1, '21':0, '00':2, '11':2, '22':2}
def which_win(i1, i2):
s = i1 + i2
return table.get(s)
# 显示规则
for i, s in enumerate(t1):
print(i, s, ', ', end='')
human = input('please input:')
h_index = int(human)
human_choice = t1[h_index]
c_index = random.randint(0,2)
computer_choice = t1[c_index]
print('human:',h_index,human_choice)
print('computer:',c_index, computer_choice)
print(t2[which_win(str(h_index), str(c_index))])
In [ ]:
# 五局三胜的剪刀石头布程序
import random
FIRST = 0
SECOND = 1
BOTH = 2
t1 = ('scissors', 'stone', 'cloth')
t2 = ('human win', 'computer win', 'draw')
table = {'01':1, '02':2, '10':0, '12':1, '20':1, '21':0, '00':2, '11':2, '22':2}
def which_win(i1, i2):
s = i1 + i2
return table.get(s)
mark = True
computer_win = 0
human_win = 0
while mark:
# 显示规则
for i, s in enumerate(t1):
print(i, s, ', ', end='')
human = input('please input:')
c_index = random.randint(0,2)
computer = t1[c_index]
print(c_index, computer)
who_win = which_win(human, str(c_index))
if who_win == 0:
human_win += 1
if who_win == 1:
computer_win += 1
print(t2[which_win(human, str(c_index))])
print('human:computer ', human_win, ':', computer_win)
print()
if (human_win == 3) or (computer_win == 3):
mark = False
if human_win == 3:
print('final human win')
else:
print('final computer win')
In [ ]:
# 猜数,机器猜
min = 0
max = 1000
guess_ok_mark = False
while not guess_ok_mark:
cur_guess = int((min + max) / 2)
print('I guess:', cur_guess)
human_answer = input('Please tell me big or small:')
if human_answer == 'big':
max = cur_guess
if human_answer == 'small':
min = cur_guess
if human_answer == 'ok':
print('HAHAHA')
guess_ok_mark = True
In [ ]: