• 函数基础初识


    一,初始函数

      1,什么是函数:函数就是 对代码块和功能的封装和定义.(就是对一种功能的封装)

      函数的定义, 函数名, 函数体以及函数的调⽤

    def 函数名():         # 在定义的时需要的参数,类似于占位符
        函数体
    
    #调用
    函数名()        # 在调用时需要传入的参数是实参
    
    #这里的函数名的命名规则和使⽤和变量量基本一样.⾃⼰己回顾⼀下变量的命名规则. 函数体: 就是函数被执行之后要执行的代码

      2,return的用法和作用:

        2.1,函数中遇到return,此函数结束,不再继续执行

    def yue():    
        print("回家")    
        print("吃饭")    
        print("约小姐姐")    
        return    
        print("约起看电影")    # 这句话不会被执⾏ 
    
    yue()    # 这里的执行结果没有'约谁啊'

        2.2, 给函数的调用者一个访问结果

    def yue():    
    print("回家")    
    print("早点回家")    
    print("约小姐姐")    
    return "等我"  #直接给函数一个返回值
    
    a = yue() 
    print(a)    # 等我
    
    def fun():
        print('没有')
         # return 5
    
    print(fun())           # 没有  None   当没有return时,函数的值永远时None
    print(fun)             #只要定义了一个函数都会生成一个地址,就像门牌号 <function fun at 0x00000158B8FD2E18>

       2.3,函数的返回值可以有多个结果,且返回的结果是一个元组,我们可以通过解构的方式获取,如 return 4,5    ,可以通过 a,b = 函数名()

    def yue():    
        print("回家")    
        print("七夕了")    
        print("约小姐姐")    
        return "去游泳", "去吃火锅"
    
    girl = yue()     # (去游泳 ,去吃火锅)
    print(type(girl))   # tuple   

       总结:  如果return什么都不写 或者 ⼲脆不写return .那么返回的就是None           

          如果return后⾯写了⼀个值. 则调⽤者可以接收一个结果 ,注意我们经常使用的print等常用的内置函数,也有retrun,如下          

          如果return后⾯写了多个结果, 则调用者可以接收一个tuple, 调用者可以直接解构成 多个变量

    a = 3
    c = print(a)
    print(c)
    
    # 结果是  3  None   这里print中也有return 只是后面没有跟值

     三元运算:

      形如:a if a > b else b   的运算形式的结构。 如果满足则a,否则b

    注意这里三元运算还可以执行更多操作:

    1.写函数,判断用户传入的对象(字符串、列表、元组)长度是否大于5。
    
    def leng(a):
        if a.startswith('[') and a.endswith(']'):
            a=a.strip('[]').split(',')  # strip()可以成对切割
            print('大于5') if len(a)>5 else print('小于或等于5')
        elif a.startwith('(') and a.endwith(')'):
            print('大于5') if len(a)>5 else print('小于5')
        else:
            print('大于5') if len(a)>5 else print('小于5')
    
    usr_input = input('请输入:').strip()
    leng(usr_input)
    
    2、写函数,检查传入列表的长度,如果大于2,那么仅保留前两个长度的内容,并将新内容返回给调用者。
    
    def li(a):
        return a[:2] if len(a)>2  else '长度小于2'
    a =[1,2,3]
    print(li(a))
    三元运算的例题

    二, 函数的参数:

      1,参数, 函数在调⽤的时候指定具体的⼀个变量的值. 就是参数.  语法:

    def 函数名(参数列列表):    
        函数
    
    def my_len(l):  # l 形式参数 形参
         print(l)
         count = 0
         for j in l:
             count += 1
         return count
    
    a = 'fdsafdsafdsagfsadf'
    print(my_len(a))  # 实际参数 ,实参
    print(my_len([1,2,3]))

      2,1. :        1,形参:  写在函数声明的位置的变量叫形参.  形式上的一个完整. 表示这个函数需要xxx

            2. 实参: 在函数调用的时候给函数传递的值. 叫实参, 实际执行的时候给函数传递的信息. 表⽰给函数 xxx

            3. 传参: 给函数传递信息的时候将实际参数交给形式参数的过程被称为传参. 

      3.1:    按照实参的角度,可以把参数分为: 位置参数, 混合参数,关键字参数   分别如下:

    #1,位置传参  (位置必须按照顺序一一对应)
     def func(a,b,c):
         print(a)
         print(b)
         print(c)
    # 位置参数必须给它传值否则会报错!!!
    func('fdsafdas',3,4)
    
    # 有点⼉儿麻烦, 我们在这里学⼀个三元运算符. 
    def my_max(a, b):    
    c = a if a > b else b   # 当a>b成立返回a, 否则返回b    
    return c
    
    my_max(5,21)
    
    
    #2,关键字参数  (可以没有顺序,但是必须是全部关键字加上一个值)
    def max_min(a,b):
        return a if a > b else b
    print(max_min(b = 300,a = 200))
    
    
    3.混合传参,就是包含关键字和位置参数的混合   (但是必须把关键字参数放在最后)
    def func1(a,b,c,d,e):
         print(a)
         print(b)
         print(c)
         print(d)
         print(e)
    func1(1,2,d=4,c=3,e=5)
    func1(1,4,d=2,c=3,e=5)

      4,按照形式参数分类: 位置参数 , 默认参数 (还有动态形参)

    #位置参数
    def func(a,b,c):
         print(a)
         print(b)
         print(c)
    func('fdsafdas',3,4)
    
    
    #默认参数
    def stu_info(name,sex = "male"):
        """打印学生信息函数,由于班中大部分学生都是男生,
            所以设置默认参数sex的默认值为'male'
        """
        print(name,sex)
    
    
    stu_info('alex')  # 默认是男的
    stu_info('eva','female')
    
    
    注意,默认参数这里有一个坑,默认参数是个可变类型时:  这里有坑,注意当默认参数是一个可变数据类型,如list,字典时,它的内存地址不会随调用轻易的改动,具体请看第二个例子
    ef defult_param(a,l = []):
        l.append(a)
        print(l)
    
    defult_param('alex')
    defult_param('egon')    #结果['alex']    ['alex', 'egon']

    请问一下的代码的运行结果分别是:______、______、_______ [10,'a']、[123]、[10,'a']
    def extendList(val,list=[]):
    list.append(val)
    return list

    list1 = extendList(10)
      #print(list)
    list2 = extendList(123,[])
    print(list)
    list3 = extendList('a',)

    print('list1=%s'%list1)
    print('list2=%s'%list2)
    print('list3=%s'%list3)
     

      5,动态参数:  按位置传值多余的参数都由args统一接收,保存成一个元组的形式

    def trans_para(*args,**kwargs):  #无敌形参
        print(args,type(args))
        print(kwargs,type(kwargs))
    trans_para("jinxin",12,[1,2,3,4],[3,4,],(1,4,7),{"a":"123","c":456},country="china")
    
    
    动态参数,也叫不定长传参,就是你需要传给函数的参数很多,不定个数,那这种情况下,你就用*args,**kwargs接收,args是元祖形式,接收除去键值对以外的所有参数,kwargs接收的只是键值对的参数,并保存在字典中。
    
    在函数里我们把args和kwargs分别进行调用就可以得到想要的值了

    练习题:

    1、.写函数,计算传入函数的字符串中,[数字]、[字母]、[空格] 以及 [其他]的个数,并返回结果。
    def count_str(li):
        a,b,s,z = 0,0,0,0
        for i in li:
            if i.isdigit():a += 1
            elif i.isalpha(): b +=1
            elif i ==' ': s += 1
            else : z +=1
        return '数字%s个,字母%s个,空格%s个,其他字符%s个'%(a,b,s,z)
    a =input('请输入:')
    print(count_str(a))
    
    2、写函数,检查传入字典的每一个value的长度,如果大于2,那么仅保留前两个长度的内容,并将新内容返回给调用者。
     dic = {"k1": "v1v1", "k2": [11,22,33,44]}
     PS:字典中的value只能是字符串或列表
    
    dic = {"k1": "v1v1", "k2": [11,22,33,44]}
    def check(dic):
        for i in dic:
            if len(dic[i]) >2:
                dic[i]=dic[i][:2]
        return dic
    print(check(dic))
    
    3.写函数,用户传入修改的文件名,与要修改的内容,执行函数,完成整个文件的批量修改操作(升级题)。
    
    def modifie(file_path,src,new):
        with open(file_path,'r',encoding='utf8') as f2,
        open('1.txt','w',encoding='utf8') as f:
                for i in f2:
                    if src in i:
                        i =i.replace(src,new)
                        f.write(i)
                        continue
                    f.write(i)
    modifie('a1.txt','alex','sb')
    课后练习题
  • 相关阅读:
    Neurosurgeon: Collaborative Intelligence Between the Cloud and Mobile Edge
    Adversarial Attack Type I: Cheat Classifiers by Significant Changes
    Federated Optimization for Heterogeneous Networks
    On the Convergence of FedAvg on Non-IID Data
    联邦学习综述
    Federated Learning: Challenges, Methods, and Future Directions
    Hop: Heterogeneity-aware Decentralized Training
    C++文件操作
    c++: internal compiler error: Killed (program cc1plus)
    SCAFFOLD: Stochastic Controlled Averaging for On-Device Federated Learning
  • 原文地址:https://www.cnblogs.com/double-W/p/9446499.html
Copyright © 2020-2023  润新知