python中的函数

本文详细介绍了Python中函数的使用,包括如何定义和调用函数、形参与实参的概念、参数类型如位置参数、默认参数、可变参数和关键字参数的运用,以及函数的返回值和作用域。此外,文章还提供了多个函数实践案例,如计算平均值、字符串分析和Collatz序列等,帮助读者巩固函数的理解。特别强调了`is`和`==`的区别,前者用于比较对象的标识,后者用于比较值的相等性。
摘要由CSDN通过智能技术生成
定义一个函数
def hello():
    print('python') ##这个函数的功能就是打印python
通过函数名来调用函数

函数必须经过调用才能作用

hello()   ##运行打印出python
函数的定义嵌套和调用

当函数定义有嵌套时,调用时,从内到外逐层调用

def westos():
    print('it is westos')
    def python():
        print('is python')
    python()  ## 先调用内部的那个函数
westos()    ##再调用外部的函数
最后显示结果时it is westos is python

形参和实参

定义函数的时候的变量 叫形参(名字任意)
def welcome(a):
    print('welcome',a)
真实的数据信息,调用函数的时候 传递 叫实参
welcome('tom')
welcome('lily')

参数:实参;形参
形参:位置参数 默认参数 可变参数 关键字参数

位置参数:形参和实参必须保持一致
def getinfo(name,age):
    print('姓名:',name,'年龄:',age)
------------------------------------
getinfo('westos',11)   
getinfo(11,'westos')     ##这样调用要严格按照函数定义的形参顺序去传递,例如这个例子:打印出来会变成name =11 age = westos ##不符合常理
------------------------------------------------
getinfo(age=11,name='westos')   ##将形参和实参直接对应起来,不会导致顺序混乱
默认参数

设置默认参数的意义在于如果用户在调用函数时,实参的数量少于形参,不会报错,而是直接补充一个原先设定好的值,让函数调用正常执行。

def mypow(x,y=2):
    print(x ** y)
mypow(2,3)
mypow(2)
可变参数

*a是对传递过来的值进行解包,因为如果传递过来的参数数据类型是列表、元组、集合、字典等不能进行直接的运算,要先进行解包,将其中的每个元素取出来

def mysum(*a):     
    print(*a)
    print(a)
    sum  = 0
    for item in a:
        sum += item    
    print(sum)     ##如果不进行解包,会直接报错

以下这些都是需要进行解包的参数类型

mysum(1,2,3,4,5)
mysum([1,2,3,4,5])
参数解包:在参数名前加*
nums = [1,2,3,4]
nums2 = (1,2,3,4)
nums3 = {1,2,3,4}
------------------------------
mysum(*nums) #进行解包  *nums:1 2 3 4
mysum(*nums2)
mysum(*nums3)
关键字参数
def getinfo(name,age,**k):
    print(name)
    print(age)
    print(k)
d = dict(a=1,b=2)
print(*d)
--------------------------
getinfo('westos',12,**d)

函数的返回值

返回值:函数运算的结果,还需要进一步操作,给函数一个返回值
return用来返回函数执行的结果,如果函数没有返回值,默认返回None
一旦遇到return 函数执行结束,后面的代码不会执行
多个返回值的时候,python会帮我们封装成一个元组类型
return会将执行过程中的值保存下来,留到后面再次调用时还可用,但是print,执行结束之后就回收了内存地址空间,不再保留值,无法进行再次的使用

def mypow(x,y=2):
    #print(x ** y)
    # pass    ##pass的作用是先让程序可以正常执行
    return x**y,x+y    ##返回值
a = mypow(2,4)
print(a)
print(mypow(5,2))   ##直接打印调用这个函数,可以正常执行
函数的作用域

一般而言,函数定义中的变量若在没有进行全局声明的情况下,只作用在这个函数内部,对于函数外的变量的独立的。
如果要将函数内部的变量声明为全局变量,则global a进行全局声明,但是此时id(a),这两个变量的身份还是不一样。

a = 1       ##这个a是全局变量
print('outside:',id(a))

def fun():
    global a #声明a为全局变量
    a = 5
    print('inside:',id(a))
--------------------------------
fun()
print(a)    ##在函数内部还没有进行a为全局变量的声明时,打印出来的是1
print(id(a))

函数的练习

编写一个函数cacluate, 可以接收任意多个数,返回的是一个元组.
元组的第一个值为所有参数的平均值, 第二个值是大于平均值的所有数.

def cacluate(*args):    #接收任意多个数,输出为元组
    avg = sum(args) / len(args)   #计算平均数
    up_avg = []     #定义一个空列表,存放比平均值大的所有数
    for item in args:    #遍历所有数
        if item > avg:
            up_avg.append(item)    #把比平均值大的加入到列表中
    return avg,up_avg    #返回平均值,以及列表
print(cacluate(1,2,3,4,5))    #调用函数

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

def Fun(str):     #定义函数,接受一个字符串参数
    upper = lower = 0     #定义计数器
    for i in str:     #遍历字符串
        if i.isupper():     #如果为大写字母,upper的值加一
            upper += 1
        elif i.islower():     #如果为小写,lower值加一
            lower += 1
        else:
            continue     #既不是大写又不是小写,继续执行
    return upper,lower     #返回大写和小写的数值
print(Fun('HELLO westos!'))    #调用函数,其中!不包括在upper和lower的值中

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

 import random
def fun(alist,k):
    if k < 0 or k > len(alist):
         return 'error key'
     # return alist[:k][::-1] + alist[k:][::-1]
      newl1 = alist[:k]
      newl2 = newl1[::-1]
      newl3 = alist[k:]
      newl4 = newl3[::-1]
      return newl2 + newl4

 list = []
 for i in range(30):
     num = random.randint(1,100)
     list.append(i)
     # if num not in list:
     #     list.append(num)
 print(list)
 a =fun(list,4)
 print(a)

给定一个仅包含数字 2-9 的字符串,
返回所有它能表示的字母组合。
给出数字到字母的映射如下
(与电话按键相同)。注意 1 不对应任何字母
输入:”23”
输出:[“ad”, “ae”, “af”, “bd”,
“be”, “bf”, “cd”, “ce”, “cf”].
说明:尽管上面的答案是按字典序排列的,
但是你可以任意选择答案输出的顺序

def phoneletter(digits):
    if not digits:
        return []
    keyboard = {
        '2':'abc',
        '3':'def',
        '4':'ghi',
        '5':'jkl',
        '6':'mno',
        '7':'pqrs',
        '8':'tuv',
        '9':'wxyz'
    }
    res = []
    if len(digits) == 0:
        return []
    if len(digits) == 1:
        return keyboard[digits] # 'ghi'
    result = phoneletter(digits[1:]) #phoneletter('4')
    for i in result:
        for j in keyboard[digits[0]]:
            res.append((j+i))
    return res
print(phoneletter('34'))

编写一个名为collatz()的函数,它有一个名为number的参数。
如果参数是偶数,那么collatz()就打印出number//2,并返回
该值。如果number是奇数,collatz()就打印并返回3*number+1。
然后编写一个程序,让用户输入一个整数,并不断对这个数
调用collatz(),直到函数返回值1(令人惊奇的是,这个序列
对于任何整数都有效,利用这个序列,你迟早会得到1!既使数学
家也不能确定为什么。你的程序在研究所谓的“Collatz序列”,
它有时候被称为“最简单的、不可能的数学问题”)。
输入:
3
输出:
10
5
16
8
4
2
1


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


is 和 == 的区别
id():在内存中存储的位置
type():变量的类型
value:值
==:type value   ##判断值是否相等
is:type value id ##判断两个变量的id是否一致
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值