python中的函数

在python中,编写程序时一般都会将其打包成一个函数,使用时只需拿来调用即可.
eg:之前所说过的copy其实就是定义的函数,而当需要copy时,只需调用copy函数

li = [1,2,3]
li.copy()

#如何定义一个函数
def 函数名():
函数体
定义一个函数后,在没有调用函数的情况下,函数是不会被执行的,执行的话必须调用

def zjs():
    print('good boy')
zjs()

函数中可以嵌套函数

def zjs():
    print('good boy')
    def sjz():
        print('bad boy')
    sjz()
zjs()

定义函数时的变量称为形参,变量名可以任意起
调用函数时的参数成为实参,该参数必须是实际存在的

def fun(a):
    print('hello %s' %(a))
fun(123)
fun('python')

函数的练习1
编写一个名为collatz()的函数,它有一个名为number的参数。
如果参数是偶数,那么collatz()就打印出number//2
如果number是奇数,collatz()就打印3*number+1

def collatz(number):
    if number % 2 == 0:
        print(number // 2)
    else:
        print(3 * number + 1)
collatz(2)		#取number=2测试

函数动态添加和删除成员

def fun():
    print(fun.x)
    fun()
# 动态添加
fun.x = 3
fun()
# 动态删除
del fun.x
fun()

函数的返回值
函数调用时一般有返回值,没有定义返回值的时候,python中默认返回None

def hello():
    print('hello')
res = hello()
print(res)

结果如下:
在这里插入图片描述
返回时return的作用

def hello():
    # return 返回的表达式或者变量
    return 'good'
res = hello()
print(res)

结果如下:
在这里插入图片描述

return的应用练习
随机生成20个学生的成绩
判断这个20个学生的等级

import random
def level(scores):
    if 90 < scores <= 100:
        return 'A'
    elif 80 < scores <= 90:
        return 'B'
    else:
        return 'C'
def main():
    for i in range(20):
        score=random.randint(1,100)
        print('成绩为%s,等级为%s' %(score,level(score)))
main()

测试结果如下:
在这里插入图片描述

##多个返回值

def fun(a):
    # 接收一个列表,求这个列表的最大值,平均值,最小值
    max_num = max(a)
    min_num = min(a)
    avg_num = sum(a)/len(a)
    # python函数中,只能返回一个值
    # 如果非要返回多个值,会把返回的值封装为一个元组数据类型
    return max_num,min_num,avg_num
t = fun([34,1,2,3,4,5,6,7,421])
print(t,type(t))

在这里插入图片描述

函数形参之四大参数类型

参数:形参 实参
形参的分类:位置参数 默认参数 可变参数 关键字参数

位置参数

#位置参数:形参和实参必须保持一致
def info(name,age):
    print(name,age)
info('sjz',21)

在这里插入图片描述

默认参数

#默认参数:形参和实参可以不一致
def mypow(x,y=2):
    """
    求x的y次方
    :param x:
    :param y:
    :return:
    """
    print(x**y)
mypow(4)
mypow(4,3)

在这里插入图片描述
可变参数

#可变参数
def mySum(*args):
    """
    需求:用户可以传递任意的值,计算数值的和
    *args:是一个可变参数
    args:是元组的数据类型
    :return:
    """
    # print(args)
    sum = 0
    for i in args:
        sum += i
    print(sum)
mySum(1,2,4,6,9,11)

在这里插入图片描述

关键字参数

#关键字参数
def stuinfo(name,age,**kwargs):
    print(name,age)
    print(kwargs)
stuinfo('sjz',21,hobbies=['running','listen music'],gender='male')

在这里插入图片描述

函数练习_平方等式
题目需求:
对于一个十进制的正整数, 定义f(n)为其各位数字的平方和,如:
f(13) = 12 + 32 = 10
f(207) = 22 + 02 + 72 = 53
下面给出三个正整数k,a, b,你需要计算有多少个正整数n满足a<=n<=b,
且k*f(n)=n
输入:
第一行包含3个正整数k,a, b, k>=1, a,b<=10
18, a<=b;
输出:
输出对应的答案;
范例:
输入: 51 5000 10000
输出: 3

def f(n):
    # 1.先把数字转换成字符串
    n = str(n)
    # 2.计算字符串中每个数的平方
    sum = 0
    for i in n:
        sum += int(i) ** 2
    return sum

def isOK(k,n):
    if k * f(n) == n:
        return True
    else:
        return False

def main():
    k = 51
    a = 5000
    b = 10000
    count = 0
    for item in range(a,b+1):
        if isOK(k,item):
            count += 1
        print(count)

main()

测试后输出为3

函数的作用域

作用域
    局部作用域
    全局作用域
# 全局作用域:作用于整个程序
num = 10
print('out fun: id=',id(num))

def fun():
    #局部作用域,在函数运行时生效,函数运行结束则释放
    num =2
    print('in fun:id=',id(num))
    print('in fun:num = %s' %(num))

fun()
print('out fun: num=%s' %(num))

测试结果如下:
在这里插入图片描述
如何将局部变量变为全局变量

num = 10

def fun():
    # 通过global关键字声明局部变量为全局变量
    # 函数执行完毕,变量依然生效
    global num
    num = 2
fun()

此时测试输出结果:
在这里插入图片描述
如图,通过global函数将局部变量变为全局变量后,调用函数后发现是我们改变的变量作用于函数
函数练习02
1.Collatz序列
编写一个名为collatz()的函数,它有一个名为number的参数.如果参数是偶数,那么collatz()就打印出number//2,并返回该值.如果number是奇数,collatz()就打印并返回3*number+1.然后编写一个程序,让用户输入一个整数,并不断对这个数
调用collatz(),直到函数返回值1(令人惊奇的是,这个序列对于任何整数都有效,利用这个序列,你迟早会得到1!既使数学家也不能确定为什么。你的程序在研究所谓的“Collatz序列”,它有时候被称为“最简单的、不可能的数学问题”).

  • 输入:
    3

  • 输出:
    10
    5
    16
    8
    4
    2
    1

def collatz(number):
    if number == 1:
        exit(0)
    elif number % 2 == 0:
        return number // 2
    else:
        return 3 * number + 1


num = int(input('输入数字:'))
while True:
    num = collatz(num)
    print(num)

输出结果如下:
在这里插入图片描述

##参数检测

def add(a, b):
    if isinstance(a, (int, float)) and isinstance(b, (int, float)):
        return a + b
    else:
        print('输入有错')
        return 'sorry'
res = add(3.5,2)
print(res)
res1 = add('sjz',2)
print(res1)
res2 = add('3.5',2)
print(res2)

测试结果如下:
在这里插入图片描述
参数检测练习

def rate(letter1,letter2):
    if not (isinstance(letter1,str)) and (isinstance(letter2,str)):
        print('cannot recognize')
        return
    if len(letter1) < len(letter2):
        print('sorry')
        return
    right= 0
    for letter1_char,letter2_char in zip(letter1,letter2):
        if letter1_char == letter2_char:
            right+=1
    return right/len(letter1)

a = 'i love study'
b = 'I love study'
print(rate(a,b))

输入结果如下:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值