python程序设计——函数设计与调用
一、函数定义与调用
def 函数名([参数列表]):
'''注释'''
函数体
# 输出小于n的斐波那契数
>>def fib(n):
a,b=1,1
while a < n:
print(a,end=' ')
a,b=b,a+b
print()
>>fib(3)
1 1 2
二、形参与实参
在绝大多数情况下,在函数内部直接修改形参的值不会影响实参
def addOne(a):
print(a)
a+=1
print(a)
>>a=3
>>addOne(a)
3
4
>>a
3
修改函数参数值的方式:
如果传递给函数的是可变序列,
并且在函数内部使用下标或其他方式为课表序列增加、删除、修改元素值时,
修改后的结果可以反映到函数之外,即实参得到相应修改
# 修改列表元素的值
def modify(v):
v[0] = v[0] + 1
>>a=[2]
>>print(a)
[2]
>>modify(a)
>>print(a)
[3]
# 为列表增加元素
def addList(v,item):
v.append(item)
>>a=[2]
>>addList(a,3)
>>print(a)
[2,3]
三、参数类型
python函数参数主要分为:普通参数、默认值参数、关键参数、可变长度参数等
在定义函数时不需要指定参数的类型,形参类型由实参类型以及python解释器的理解和推断决定
同样,不需要指定函数的返回值类型,由return语句返回值的类型决定
缺少return语句或没有执行return语句时,默认返回空值None
1. 默认值参数
调用带有默认值的函数时,可以不对默认值参数赋值,也可以通过显示赋值来替换其默认值
在定义带有默认值的函数时,默认值参数必须出现在函数形参列表的最右端,且任何一个默认值参数右边都不能再出现非默认值参数
def 函数名(..., 形参名=默认值 ): 函数体 def say(message, time=1): print((message+' ')*times)
>>say.__defaults__
(1,)
2.关键参数
指调用函数时的参数传递方式,而与函数定义无关
通过关键参数可以按名字传递值,实参顺序可以和形参不一致
def demo(a,b,c=5):
print(a,b,c)
>>demo(3,7)
3 7 5
>>demo(c=8,a=9,b=0)
9 0 8
3.可变长度参数
*parameter 用来接收任意多个实参并将其放在一个元组中
**parameter 用来接收类似于关键参数一样显示赋值形式的多个实参并将其放入字典中
def demo(*P):
print(P)
# 将实参放入元组
>>demo(1,2,3)
(1,2,3)
# 在调用函数时,自动将接收参数转换为字典
def demo(**p):
for item in p.items():
print(item)
>>demo(x=1,y=2,z=3)
('x', 1)
('y', 2)
('z', 3)
4.参数传递时的序列解包
可以使用列表、元组、集合、字典及其他可迭代对象作为实参,
并在实参名称前加一个星号,解释器自动进行解包,并传递给多个单变量形参
要保证实参中元素个数与形参个数相等
def demo(a,b,c):
print(a+b+c)
>>seq = [1,2,3]
>>demo(*seq)
6
# 字典型,默认按照键解包
>>dic={1:'a',2:'b',3:'c'}
>>demo(*dic)
6
# 指定按照值解包
>>demo(*dic.values())
abc
四、变量作用域
函数内部定义的变量一般为局部变量,不属于任何函数的变量一般为全局变量
应尽量避免使用全局变量,引用速度慢,增加不同函数之间的隐式耦合度
如果想在函数内部修改一个定义在函数外的变量值,那么这个变量就不能是局部的
def demo():
global x # 声明全局变量
x=3 # 修改全局变量的值
y=4 # 局部变量
print(x,y)
x=5 # 在函数外定义全局变量
demo() # 调用函数,修改全局变量的值
print(x)
out: 5
print(y) # 函数结束后,局部变量自动删除
out: NameError: name 'y' is not defined
del x # 删除全局变量
不同模块间共享全局变量,定义单独的模块,传递全局变量
# 定义模块 A.py
global_var = 0
# 在模块 B.py中
import A
A.global_var = 1
# 在模块C.py中
import A
A.global_var = 2
函数实例:
1、编写函数,接收字符串参数,返回一个元组,其中第一个元素为大写字母个数,第二个为小写字母个数
def countStr(s):
result = [0,0]
for ch in s:
if 'a'<= ch <= 'z':
result[1] += 1
elif 'A' <= ch <= 'Z':
result[0] += 1
return result
tmpStr = 'abANV'
bigN,littleN = countStr(tmpStr)
print(bigN,littleN)
out:
3 2
2、编写函数,接收一个所有元素值互不相等的整数列表x和一个整数n,要求将值为n的元素作为支点,
将列表中所有小于n的元素全部放在n的前面,所有值大于n的元素放在n后面
1 import random
2 def sortN(x,n):
3 if n not in x:
4 print(n,' is not an element of ',x)
5 return
6
7 i = x.index(n) # 获取指定元素在列表中的索引
8 x[0],x[i] = x[i],x[0] # 与第0个元素交换
9 key = x[0]
10
11 i = 0
12 j = len(x)-1
13 while i<j:
14 while i < j and x[j] >= key:
15 j-=1
16 x[i]=x[j] # 从后向前找第一个比指定元素小的元素
17
18 while i < j and x[i] <= key:
19 i+=1
20 x[j]=x[i] # 从前向后找第一个比指定元素小的元素
21
22 x[i] = key
23
24 return x
1 x=list(range(1,10))
2 random.shuffle(x)
3 print(x)
4 sortN(x,4)
5 print(x)