函数:

  • 函数的定义用def,函数名后要用冒号
  • 函数的参数:多个参数用逗号隔开即可,最好写好注释,方便他人或自己日后维护
  • 函数的返回:函数中使用return
  • 将实现某些功能的代码打包成块调用使用,Python中用def来定义函数。
  • 有参数之后函数可用性增加
def 函数名(参数):
    代码块
  • 调用函数:函数名(参数) 
  • 当函数被调用时就会向上寻找函数定义并依次执行函数
  • 当函数未定义时就调用失败 
  • 函数返回值:通过return返回函数结果
>>> def a(n1,n2):
	return n1+n2

>>> print(a(2,3))
5
  • 形参与实参

函数定义过程中设置的参数为形参,他只是一个形式,表示占据一个参数位置;

函数调用时传入的参数为实参,他是具体的参数值。 

  • 函数文档

功能与注释相同,用引号括起来,在函数运行时不会运行函数文档;

可用函数名._doc_打印函数文档,也可用help(函数名)打印函数文档。 

  • 关键字参数

解决由于参数过多而导致参数位置设置不当的问题,在调用函数时将形参与实参对应。

>>> def Fun(name,id):
	print(name+'的学号是'+id)

>>> Fun(id='666',name='yyl')
yyl的学号是666

 

  • 默认参数

定义函数时定义了默认值的参数,含有默认值的参数在调用时可不用传递参数而使用默认参数;

若调用时传递了实参则使用调用时传递的参数。

>>> def Fun(name='yyl',id='666'):
	print(name+'的学号是'+id)

>>> Fun()
yyl的学号是666
>>> Fun('y')
y的学号是666

 

  • 收集参数

当不确认函数具体有几个参数时可以在函数定义时使用收集参数,即可变参数;

注意当使用了收集参数后还有参数,则需要在调用函数时使用关键字参数定位参数,或者可将后面参数设置为默认参数。

>>> def test(*params):
	print('参数长度为:',len(params))
	print('第二个参数为:',params[1])

	
>>> test('yyl','666','hhh','xx')
参数长度为: 4
第二个参数为: 666

>>> def test(*params,word):
	print('参数长度为:',len(params))
	print('第二个参数为:',params[1],'word的值为:',word)

	
>>> test('yyl','666','hhh','yu','aaa')
Traceback (most recent call last):
  File "<pyshell#24>", line 1, in <module>
    test('yyl','666','hhh','yu','aaa')
TypeError: test() missing 1 required keyword-only argument: 'word'
>>> test('yyl','666','hhh','yu','aaa',word='richhhhhhhh')
参数长度为: 5
第二个参数为: 666 word的值为: richhhhhhhh

习题:

1、编写一个函数power()模拟内建函数pow(),即power(x, y)为计算并返回x的y次幂的值。

方法一:
def power(x,y):
    m=x
    while y>1:
       m=m*x
       y-=1
    return m

print(power(3,2))
9

方法二:
def power(x,y):
    m=x**y
    return m

print(power(3,2))
9

2、编写一个函数,利用欧几里得算法求最大公约数,例如gcd(x, y)返回值为参数x和参数y的最大公约数。

方法一:
def gcd(x,y):
    i=min(x,y)
    while i>=1:
        if x%i==0 and y%i==0:
            return i
        else:
            i-=1

print("请输入两个值:")
x=int(input())
y=int(input())
print("%d和%d的最大公约数是:"%(x,y),gcd(x,y))
请输入两个值:
25
15
25和15的最大公约数是: 5

方法二:
def gcd(x,y):
    while y:
        t = x % y
        x = y
        y = t
    return x
print(gcd(18,9))
3、编写一个符合以下要求的函数:

a) 计算打印所有参数的和乘以基数(base=3)的结果
b) 如果参数中最后一个参数为(base=5),则设定基数为5,基数不参与求和计算。

def Sum(*params,base=3):
    result = 0
    for i in params:
        result += i
    result *= base

    print('结果是:', result)

Sum(1, 2, 3, 4, 5)
Sum(1, 2, 3, 4, 5, base=5)

输出:
结果是: 45
结果是: 75

 

4、 寻找水仙花数

题目要求:如果一个3位数等于其各位数字的立方和,则称这个数为水仙花数。例如153 = 1^3+5^3+3^3,因此153是一个水仙花数。编写一个程序,找出所有的水仙花数。

def Nacissus():
    print('所有的水仙花数为:',end='')
    for each in range(100, 1000):
        temp = each
        sum = 0
        while temp:
            sum = sum + (temp % 10) ** 3
            temp = temp // 10  #注意这里是地板除

        if sum == each:
            print(each, end='  ')

Nacissus()

5、编写函数findstr()在目标字符串中统计子字符串出现的次数

def findstr():
    ls=input('请输入主字符串:')
    ss=input('请输入子字符串:')
    i=0
    count=0
    for i in range(len(ls)):
        if ss[0]==ls[i] and ss[1]==ls[i+1]:
            count=count+1
    count=int(count)
    print('子字符串在目标字符串中出现的次数为%d次'%count)

findstr()


#可用 if ss not in ls先判断子字符串是否在目标字符串中,提高查找效率

 总结:

  • 分清楚形参和实参
  • 函数文档:是函数的一部分,与解释不同,使用help(函数名)或者 函数名____doc_____(前后分别两个下划线)可以查看到
  • 关键字参数(在一个函数的参数较多的时候作用比较明显):
    给参数的名字下定义,例如:
    def F(name,words)如下两种引用的方法是等价的
    F(A,B) = F(words=B,name=A)
  • 默认参数:函数定义时为形参赋初值,函数调用时若没有传递参数,则自动使用初值
  • 收集参数(可变参数)