python——函数

本文详细介绍了Python中的函数定义和使用,包括位置参数、默认参数、可变参数、关键字参数的用法,以及函数的返回值、作用域等概念。通过实例展示了如何编写和调用函数,如计数字母、列表操作和Collatz序列。最后,提到了一个基于条件概率的模拟抽奖游戏问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

如何定义一个函数

   def hello():
    print('hello')
    print('world')
hello()         通过函数名调用函数

实验效果
hello
world

函数里面嵌套函数

def lucky():
    print('is girl')
    def boy():  在上面的函数里面在嵌套一个函数
        print('is  boy')
    boy()  先用一个函数名调用一个函数,接着可以再次调用
lucky()

实验效果
is girl
is  boy

参数:形参 实参

  • 定义函数的时候的变量,叫形参(形参可以任意起名)
  • 调用函数的时候传递的参数叫实参,有真实的数据信息
def welcome(a):       定义函数时候提供的就是形参了
    print('hello',a)
welcome('tom')         而这里的tom 传递了实际的参数,真是的信息

形参

位置参数:形参和实参必须保持一致,按照位置传参数
def Info(name,age):
    print(name,age)
Info('bbo',20)   这种情况一般的是可以识别的
但是更推荐下边这种
Info(name='bbo',age=20)      因为计算机是不知道你所需要传的参数是往那个地方传的,这样是可以更准确的传参

实验效果
bbo 20

默认参数

def decik(x,y=2):
    print(x**y)
decik(2,3)   指定实参
decik(4)   这里只默认上传了一个 参数默认的是2,

实验效果
8
16

可变参数
* 主要使用在函数参数中,在定义函数中添加是为了在调用该函数时直接将多个参数转换成一个元组,而在调用函数时参数添加 *,是为了将列表或者元组转化成多个参数。

def sums(*a):
    print(*a)
    print(a)
    api = 0
    for i in a:
        api += i
    print(api)
nums = [1,2,4,5]
nums1=(5,6,7,8)
nums2={2,3,4,5}
#参数解包,在参数名前加*
print(*nums)
print(*nums1)
print(*nums2)

实验效果
1 2 4 5
5 6 7 8
2 3 4 5

关键字参数

**也主要使用在函数参数中,在定义函数中添加是为了在调用该函数时可以添加任意一个键值对转出一个字典,而在调用函数时在列表中添加 **,是为了将字典转化成多个参数
*k:是一个字典,可以传递任意多的key-value

def func(name,age,**k):
    print(name)
    print(age)
    print(k)
d = dict(a=1,b=2)
print(*d)     对字典进行解包,一个星号,获取所有的key值 

实验效果
a  b
##如果是不对字典解包的,可以直接
##print(d)
实验效果如下
{'a': 1, 'b': 2}   直接分解出的就是字典
def func(name,age,**k):   这里的**k在函数中意思就是可以转出字典
    print(name)
    print(age)
    print(k)
func('lucky',20,c=99)

实验效果
lucky
20
{'c': 99}

函数的返回值
返回值:函数运算的结果,还需要进一步操作,给函数一个返回值
return用来返回函数执行的结果,如果函数没有返回值,默认返回None
一旦遇到return 函数执行结束,后面的代码不会执行
多个返回值的时候,python会帮我们封装成一个元组类型

def pow(x,y=2):
    return x**y,x+y
print('@@@@@')
a = pow(5)      在这里默认赋值是给x 赋值
print(a)
print(pow(6))  打印的也是默认给x 赋值

实验效果
@@@@@
(25, 7)
(36, 8)

作用域
局部变量:在函数内部定义的变量,只在函数内部起作用,函数执行结束后,变量会自动删除
定义在函数内部的变量拥有一个局部作用域,定义在函数外的拥有全局作用域。
局部变量只能在其被声明的函数内部访问,而全局变量可以在整个程序范围内访问。调用函数时,所有在函数内声明的变量名称都将被加入到作用域中

a = 1
print('outside:',id(a))
def func():
    global a
    a = 4
    print('inside:',id(a))
func()
print(a)
print(id(a))

实验效果
outside: 9322464
inside: 9322560
4
9322560
编写一个函数cacluate, 可以接收任意多个数,返回的是一个元组.
元组的第一个值为所有参数的平均值, 第二个值是大于平均值的所有数.
def cacluate(*args):
    sum = 0
    k = 0
    for i in args:
        sum +=i
        k +=1
        aver=sum/k
    list=[]
    for i in args:
        if i>aver:
            list.append(i)
    return (aver,list)
a =  cacluate(2,3,4,6,7,1,9)
print(a)

编写一个函数, 接收字符串参数, 返回一个元组,‘ehllo WROLD’
元组的第一个值为大写字母的个数, 第二个值为小写字母个数.

def anyway(args):
    low=0
    upp=0
    for ade in args:
        if str(ade).isupper():
            upp+=1
        elif str(ade).islower():
            low+=1
    return upp,low
print(anyway('ehllo WORLD'))

编写函数, 接收一个列表(包含30个整形数)和一个整形数k, 返回一个新列表.
函数需求:
将列表下标k之前对应(不包含k)的元素逆序;
- 将下标k及之后的元素逆序;
[1,2,3,4,5] 2 [2,1,5,4,3]

def func(alist,k):
    if k<0 or k>len(alist):
        return 'error key'
    return alist[:k][::-1] + alist[k:][::-1]
print(func([1,2,3,4,5],2))

实验效果
[2, 1, 5, 4, 3]

编写一个名为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()
    elif number% 2 ==0:
        return number//2
    else:
        return 3*number+1
num =int(input('Num:'))
while True:
    num =collatz(num)
    print(num)

实验效果
Num:3
10
5
16
8
4
2
1

题目:两个乒乓球队进行比赛,各出三人。
甲队为a,b,c三人,乙队为x,y,z三人。
已抽签决定比赛名单。有人向队员打听比赛的名单。
a说他不和x比,c说他不和x,z比,请编程序找出三队赛手的名单。

team = ['x','y','z']
all_order = []
for i in team :
    for k in team :
        if k != i :
            for m in team:
                if m !=k and m !=i :
                    all_order.append([i,k,m])
for t in all_order :
    if t[0] !=team[0] and t[2] != team[0] and t[2] != team[2] :
        print('a <——> %s ; b  <——> %s ; c <——> %s ' %(t[0],t[1],t[2]))

效果演示
a <——> z ; b  <——> x ; c <——> y 

模拟轮盘抽奖游戏
轮盘分为三部分: 一等奖, 二等奖和三等奖;
#轮盘转的时候是随机的,
###如果范围在[0,0.08)之间,代表一等奖,
###如果范围在[0.08,0.3)之间,代表2等奖,
###如果范围在[0.3, 1.0)之间,代表3等奖,
###模拟本次活动1000人参加, 模拟游戏时需要准备各等级奖品的个数.

import random
def gift():
    tomcat = float(random.randint(0,101)/100)
    return tomcat
list= [0,0,0]
for i in range(1000):
    if 0.08> gift()>=0:
        list[0] +=1
    elif 0.3>gift()>=0.08:
        list[1] +=1
    else:
        list[2] +=1
print(list)

效果演示
[79, 205, 716]  分别为一二三等奖
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值