函数的分类以及使用

今日内容

  目录

  一、函数形参与实参

  二、实参的分类

  三、形参的分类

  四、可变参数的整体使用

 

    一、函数实参与行参的定义

  

  

'''
1.1实参:
实参:调用函数阶段,在括号内传入的实际值,值可以为常量、变量、表达式或三者的组合
*****
1.2形参
形参:定义函数阶段,在括号内声明的变量名,用来接受外界传来的值

 
形参与实参的关系:形参随着函数的调用而产生,随着调用结束而销毁
'''

  

  

# ***** 在函数定义()中出现的参数:形参
# ***** 形参就是拷贝实参的值,随着函数的调用才产生,随着函数调用结束而销毁
def fn(a, b, c):
    # a,b,c必须要从外界获取值,才有意义
    print(a)
    print(b)
    print(c)
    # 外部提前产生了的变量,内部可以使用
    print(x)
    print(y)
    print(z)

# x,y,z是实际存在的值
x = 10
y = 20
z = 30
# ***** 在函数调用()中出现的参数(外界实际存在的值):实参
# fn(10, 20, 30)
# fn(x, y, z)
fn(x + 10, y * 2, z / 5)
# ***** 调用函数是,实参可以由 常量、变量、表达式或三种的组合

    二、实参分类:

  2.1实参分类:

'''
1.位置实参:不用明确形参名的传参方式,一定按照位置给形参传值,一一对应给形参传值
2.关键字实参:必须明确形参名字与值为形参传值,可以不用按照位置,指名道姓


*****
注:混用(位置参数必须在关键字参数前面)
1.关键字实参必须出现在位置实参后
2.多个位置实参还是按照位置传参
3.关键字实参为没有从位置实参拿到值的形参传值,可以不用按照指定顺序
'''
def fn2(a, b, c, d, e, f):
    print(a, b, c, d, e, f)

fn2(10, 20, 30, e=100, f=500, d=200)

 

# 位置实参: 按照位置的顺序,从左到右为形参传递值
# 关键字实参

# 实参作用:为形参传递值

def fn1(
a, b, c):
    print(a, b, c)

# 位置实参:必须按照顺序一一传给形参
fn1(10, 20, 30)
fn1(30, 20, 10)

# 关键字实参:可以不按顺序传递, 形参按名字取值
fn1(a=10, b=20, c=30)
fn1(c=30, b=20, a=10)

# 两者混用: 关键字实参必须出现在位置实参之后
# fn1(10, c=20, a=30)  # 10按位置传参给a,a=30给a传参,c可以拿到20,但b没人传参
# TypeError:fn1() got multiple values for argument 'a' a被多次传值

# 合法传参 *****
fn1(10, c=30, b=20)
fn1(10, b=30, c=20)


def fn2(a, b, c, d, e, f):
    print(a, b, c, d, e, f)

fn2(10, 20, 30, e=100, f=500, d=200)

   三、形参的分类

 

   1.形参分类:

  

 

  

    1.1位置形参

    

# positional argument
def fn(a, b, c):
    print(a, b, c)
    
# 位置形参可以由 位置实参 与 关键字实参 来传值
fn(10, 20, 30)
fn(a=10, b=20, c=30)

    2.2默认形参

    

def fn(a=10,b=20):
    print(a, b)
    
# 默认形参可以由 位置实参 与 关键字实参 来传值,还可以不用传值(采用自身默认值)
fn()
fn(20, 30)
fn(a=200, b=300)
fn(100)  # 就给a传
fn(b=100)  # 就给b传


# 混用
# 位置形参与默认形参同时存在,默认形参必须在后
def fn1(a,b,c=10,d=20):
    print(a, b, c, d)

# 位置形参必须传值,默认形参分情况传值
fn1(100, 200, d=1000)

    3.3可变长形参

    

# 可变长形参会以 元组 形式接受 位置形参与默认形参未接受完的 所有传入的位置实参,用索引来取第几个
# 可变长形参只能由 位置实参 来传值  *****
def fn(a, b=10, *args):
    print(a, b)
    print(args)
    
    
# 小细节:可变长形参只能接受位置实参的值,位置实参还必须在关键字实参前,
#       导致默认形参只能由位置实参来传值
fn(1, 20, 100, 200) # 1给a  20给b,不能用b=20传  100,200给args
    

  

    2..命名关键字形参(在*与**之间的参数,都是要用关键字实参进行传值)作为了解知识点

    

# 命名关键字参数:在函数定义阶段 写在*与**可变长参数之间的形参
# 在给命名关键字参数传值的时候 只能用关键字为其传值
# 在定义阶段 给你感觉好像是z是默认值参数 放在了m这个位置参数的前面了 应该报错
# 其实z和m都是命名关键字参数 不是默认值参数和位置参数

def func(x,y=1,*args,z=2,m,**kwargs):
print(x,y)
print(args)
print(z,m)
print(kwargs)
func(1, 2, 3, 4, 5, 6, 7,z=8,m=9,k=666,p=999
 
  

1 2
(3, 4, 5, 6, 7)
8 9
{'k': 666, 'p': 999}



 总结:形参顺序  位置参数>  默认参数 > 可变长参数 

 

 

  四、可参数的整体使用

  

# 1、可变位置形参以元组方式接收值
# 如:接收10,20,30三个数
def fn1(*args):
    print(args)  # (10, 20, 30)
    
# 第一种传参
fn1(10, 20, 30)

# 第二种传参
t = (10, 20, 30)  # 单列集合及字符串类型都可以
fn1(*t)

  

# 2、可变位置实参以字典方式接收值
def fn2(**kwargs):
    print(kwargs)  # {'name': 'Owen', 'age': 18}
# 第一种传参
fn2(name='Owen', age=18)

# 第二种传参
d = {'name': 'Owen', 'age': 18}  # 单列集合及字符串类型都可以
fn2(**d)

   四。作业

  

1、写函数,,用户传入修改的文件名,与要修改的内容,执行函数,完成批量修改操作
2、写函数,计算传入字符串中【数字】、【字母】、【空格] 以及 【其他】的个数

3、写函数,判断用户传入的对象(字符串、列表、元组)长度是否大于5。

4、写函数,检查传入列表的长度,如果大于2,那么仅保留前两个长度的内容,并将新内容返回给调用者。

5、写函数,检查获取传入列表或元组对象的所有奇数位索引对应的元素,并将其作为新列表返回给调用者。

6、写函数,检查字典的每一个value的长度,如果大于2,那么仅保留前两个长度的内容,并将新内容返回给调用者。
dic = {"k1": "v1v1", "k2": [11,22,33,44]}
PS:字典中的value只能是字符串或列表

复制代码
#题目一
def modify_file(filename,old,new):
    import os
    with open(filename,'r',encoding='utf-8') as read_f,\
        open('.bak.swap','w',encoding='utf-8') as write_f:
        for line in read_f:
            if old in line:
                line=line.replace(old,new)
            write_f.write(line)
    os.remove(filename)
    os.rename('.bak.swap',filename)

modify_file('/Users/jieli/PycharmProjects/爬虫/a.txt','alex','SB')

#题目二
def check_str(msg):
    res={
        'num':0,
        'string':0,
        'space':0,
        'other':0,
    }
    for s in msg:
        if s.isdigit():
            res['num']+=1
        elif s.isalpha():
            res['string']+=1
        elif s.isspace():
            res['space']+=1
        else:
            res['other']+=1
    return res

res=check_str('hello name:aSB passowrd:alex3714')
print(res)


#题目三:略

#题目四
def func1(seq):
    if len(seq) > 2:
        seq=seq[0:2]
    return seq
print(func1([1,2,3,4]))


#题目五
def func2(seq):
    return seq[::2]
print(func2([1,2,3,4,5,6,7]))


#题目六
def func3(dic):
    d={}
    for k,v in dic.items():
        if len(v) > 2:
            d[k]=v[0:2]
    return d
print(func3({'k1':'abcdef','k2':[1,2,3,4],'k3':('a','b','c')}))
复制代码

  

  

转载于:https://www.cnblogs.com/mofujin/p/10623142.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值