zoukankan      html  css  js  c++  java
  • Python 基础3 函数function

    1、函数 function
      什么是函数:函数是可以重复执行的语句块,可以重复调用;
      作用:
        用于封装语句,提高代码的重用性
        用于定义(创建)用户级别的函数
      语法:
        def 函数名(形参列表):
          语句块
      说明:
        1、函数的名字就是语句块的名称;
        2、函数名的命名规则与变量名相同(函数名必须是标识符(字母或下划线开头));
        3、函数名是一个变量;
        4、函数有自己的名字空间,在函数外部不可以访问函数内部的变量,在函数内部可以访问函数外部的变量,要让函数处理外部数据需要用参数给函数传入一些数据;
        5、参数列表 可以为空;
        6、语句部分不能为空,如果为空需要用pass语句填充;

    2、函数调用:
        函数名(实际调用传递参数,简称实参)
      说明:
        函数调用是一个表达式;
        如果没有return语句,函数执行完毕后返回None对象;
        如果函数需要返回其它的对象需要用到return语句;

    3、函数说明:
      函数外部无法访问函数内部的局部变量;
      函数内部可以访问函数外部的变量,但不能修改函数外部变量的绑定关系;

    示例:
        x = 0
        def myadd(a,b):
             x = a + b
             print(x)    #结果为300
        myadd(100, 200)
        print(x)      # 结果为0

    4、return 语句:
      语法:
        return [表达式]
      注:[] 代表内容可省略
      作用: 结束函数的执行,返回到调用函数位置!
          只用于函数中,结束当前的函数的执行,返回到调用该函数的位置 ,同时返回表达式的引用关系;
      说明:
      1、return 语句后跟的表达式可以省略,省略后相当于return None;
      2、如果函数内没有return语句,则函数执行完最后一条语句后返回None(相当于在最后加了一条return None语句);

    示例:
        def say_hello():
            print('1')
            print('2')
            return
            print('3')
        say_hello()
        say_hello()    
    #注意:这里函数调用返回的结果是1 ,2, 1,2;函数内看到return语句表示结束当前的函数执行,返回调用该函数位置。

    5、函数的参数传递
      传递方式:
        位置传参
        序列传参
        关键字传参
        字典关键字传参

      5.1、位置传参:

        实际传递参数(以下简称实参)与形式参数(形参)的对应关系按位置来依次对应;

     示例:
        position_give_args.py
    def myfun(a, b, c):
         print('a=', a)
         print('b=', b)
         print('c=', c)
    
    myfun(1, 2, 3)

       5.2、序列传参:(归属位置传参)

        序列传参是指在函数调用过程中用“*”将序列拆解后按位置进行传递的传参方式;

    示例:sequence_give_args.py
    def myfun(a, b, c):
         print('a=', a)
         print('b=', b)
         print('c=', c)
    
    s = "ABC"
    L = [4,5,6]
    t = (1.1, 2.2, 3,3)
    myfun(*s)    #字符串序列传参
    myfun(*L)    #列表序列传参
    myfun(*t)    #元组序列传参

      5.3、关键字传参:
        关键字传参是指传参时,按着形参的“名称”给形参赋值,实参和形参按名称进行匹配;

    示例:#keyword_give_args.py
    def myfun(a, b, c):
         print('a=', a)
         print('b=', b)
         print('c=', c)
    
    myfun(b=2, c=3, a=1)

      5.4、字典关键字传参:(归属关键字传参)
        是指实参为字典,将字典用“**” 拆解后进行关键字传参的传参方式;

    示例:dict_keyword_give_args.py
    def myfun(a, b, c):
         print('a=', a)
         print('b=', b)
         print('c=', c)
    
    d = {'a':111, 'c':333, 'b':222}
    myfun(**d)

     说明:字典的键名和形参名必须一致;
        字典的键名必须为字符串(且必须为标识符的规则);
        字典的键名要在形参中存在;

      5.5、函数的综合传参:
          函数的传参方式在能确定形参 能唯一匹配到对应实参的情况下可以任意组合;
        要求:
          位置传参在前,关键字传参在后!

    示例:com_give_args.py
    def myfun(a, b, c):
         print('a=', a)
         print('b=', b)
         print('c=', c)
    
    myfun(1,c = 3, b = 2)
    myfun(100, *[200, 300])
    myfun(*"AB", 300)
    myfun(*"AB", **{'c':300})

    6、函数的缺省参数
      语法:
        def 函数名(形参名1=默认实参1,形参名2=默认实参2,....)

      说明:
        缺省参数必须自右至左依次存在,如果一个参数 有缺省参数,则其右侧的所有参数都必须有缺省参数;
        def fa(a=1, b, c=3): #是错误的
        缺省参数可以有0个或多个,甚至全部都是缺省参数;

    示例:#defualt_args.py   
    def info(name, age=1,address="未填写"):
        print(name,'今年',age,'岁,住在:', address)
    info('小李')
    info('小李', age=20)
    info('小李', age=20,address='重庆')
    info('小李', 33, '重庆市大竹林')

    7、函数形参的定义方式:
      位置形参
      星号元组形参
      命名关键字形参
      双星号字典形参

      7.1、位置形参:
        语法:
          def 函数名(形参名1,形参名2,...):
            语句块
      7.2、星号元组形参:
        语法:
          def 函数名(*元组形参名):
            语句块
        作用:收集多余位置传参

    print("示例见:#star_tuple_args.py")
    #星号元组形参
    def fb(*args):
        '''args绑定一个元组'''
        print('实参个数是:', len(args))
        print("args:", args)
    fb()
    fb(1,2,3,4)

      7.3、命名关键字形参:
        语法:
          def 函数名(*,命名关键字形参):
            语句块
          或
          def 函数名(*args,命名关键字形参):
            语句块
        作用: 强制*后所有的传参都必须用关键字传参

    示例:#keywords_args.py
    def fa(a, b, *, c, d):
        '''强制c,d必须用关键字传参'''
        print(a, b, c, d)
    #
    fa(1,2,3,4) #错的
    fa(1,2, c=3, d=4)
    fa(1,2, d=400, c=300)
    
    def fb(a, b, *args, c, d):
        '''强制c,d必须用关键字传参'''
        print(a, b, args,c, d)
    #
    fb(1,2,3,4,5,d=400,c=200)    #1 2 (3, 4, 5) 200 400
    fb(1,2,3,4,5,**{'d':400,'c':300})    #1 2 (3, 4, 5) 300 400

      7.4、双星号字典形参:
        语法:
          def 函数名(**字典形参名):
            语句
        作用: 收集多余的关键字传参

    示例:#double_start_keyword_args.py
    def fa(**kwargs):
        '''kwargs绑定字典'''
        print("多余的关键字传参的个数是:", len(kwargs))
        print("kwargs =", kwargs)
    #
    fa(a=10, b=20, c=30)    #kwargs = {'a': 10, 'b': 20, 'c': 30}
    
    def fb(*args, a, **kwargs):
        print(args, a, kwargs)
    
    fb(1,2,3,4,5, a=10, b=30, c=40)    #(1, 2, 3, 4, 5) 10 {'b': 30, 'c': 40}

    函数的参数说明:
      位置形参,星号元组形参,命名关键字形参,双星号字典形参,缺省参数可以混合使用;

    函数参数自左至 的顺序依次为:
      位置形参
      星号元组形参
      命名关键字形参
      双星号字典形参

    示例:
        def fn(a, b, *args, c, d, **kwargs):
             print(a, b, args, c, d, kwargs)
        fn(1,2,3,4, c=100, d=200, e=300, f=400)        #1 2 (3, 4) 100 200 {'e': 300, 'f': 400}
    
    #1.思考题
    #查看>>>help(print)
    #猜想print函数的参数列表是如何定义的?
    def myprint(*args, sep=' ', end='
    ')
        L = [str(x) for x in args] #把所有元组元素转为字符串列表
        s = sep.join(L)      #把列表中字符串以sep变量字符串连接成字符串,赋值给s
        s += end
        print(s, end='')
    #方法二
    def pyprint1(*args, sep=' ', end='
    '):
        print(*args, sep=sep, end=end)  #直接调用print函数,传参
    #
    myprint(1,2,3,4,5)
    myprint('hello','world',sep='#')
    myprint(1,2,3,4, sep=':', end='我是结尾
    ')
    
    
    #2..思考题写一个myrange函数,参数可以传入1-3个,实际意义同range函数规则相同,此函数返回符合range(。。。)函数规则的列表
    def myrange(start,stop=None,step=1):
        r_lst =[] #即将返回的列表
        #调整三个形参的值
        if stop is None:
            stop = start
            start = 0
        if step > 0:
            while start < stop:
                r_lst.append(start) #把当前数加入到列表中
                start += step   #让start向后移动,准备下次操作
        else:   #当步长小于0的情况,倒序
            for x in range(start,stop,step):
                r_lst.append(x)
        return r_lst
    #
    L = myrange(4)
    print(L) #[0,1,2,3]
    L = myrange(4,6)
    print(L) #[4,5]
    L = myrange(1,10,3)
    print(L) #[1,4,7]
    L = myrange(10,1,-2)
    print(L)
    print('1.题---------------')
    #练习
    #1. 算出 100-999之间的水仙花数(narcissistic number)
    #   水仙花数是指百位的3次方,加上十位的3次方,加上个位的3次方等于原数的整数
    #   例如  153 = 1 ** 3 + 5 ** 3 + 3 ** 3
    #   建议先写一个函数is_narcissistic(n)来判断n是否为水仙花数,如果是返回True,否则返回False
    #   再调用些函数进行判断
    
    def is_narcissistic(n):
        L = list(str(n))
        jisuan = int(L[0]) ** 3 + int(L[1]) ** 3 + int(L[2]) ** 3
        if jisuan == n:
            return True
        else:
            return False
    #
    #n = int(input('请输入三位整数:'))
    #print('判断', n, '是否为水仙花数,结果', is_narcissistic(n))
    print('水仙花数为:')
    for x in range(100,1000):
        if is_narcissistic(x):
            print(x, end=' ')
    else:
        print()
    
    print('
    
    ')
    print('2.题---------------')
    #2. 求100以内的全部素数(质数)
    #   2,3,5,7,11..........
    #建议用函数来做
    #两个函数
    #    def is_prime(x):
    #        判断 x是否是素数,是返回true ,否返回False
    #    def print_primes(n):
    #        此函数打印小于n的全部素数
    #     print_primes(100)开始打印
    
    #定义判断质数函数,是返回true,不是返回false
    def is_prime(x):
        if x < 2:
            return False
        for i in range(2, x):
            if x % i == 0:
                return False
        return True
    
    def print_primes(n):
        print('小于',n,'的全部素数:',end=' ')
        for i in range(n):
            #调用函数判断i是否是素数
            if is_prime(i):
                print(i, end=' ')
        else:
            print()
    
    print_primes(100)
    
    print('
    
    ')
    #3.将上次的student_info.py改写为两个函数:
    #1) def input_student():
    #2)  def output_student(L):
    #   主程序调用:
    #   docs = input_student()
    #   output_student(docs)
    #   print(请再添加几个学生信息..)
    #   docs += input_student()
    #print(添加之后的学生信息是)
    #output_student(docs)
    
    
    def input_student():
        lst = []  #定义空列表
        #定义循环读入学生信息
        while True:
            student_name = input('请输入学生姓名:')
            #判断输入学生姓名为空结束输入
            if not student_name:
                break
            student_age = int(input('请输入学生年龄:'))
            student_score = int(input('请输入学生成绩:'))
            student_dict = {}   #定义新空字典,用于存放学生信息
            student_dict['name'] = student_name
            student_dict['age'] = student_age
            student_dict['score'] = student_score
            #将字典使用append方法,存入到L列表中,注意这此处未改变L全局变量的绑定关系
            lst.append(student_dict)
        #print('打印列表lst信息: ',lst)
        return lst
    
    def output_student(L):
        #显示学生信息列标头
        print('+','-' * 20,'+','-' * 10,'+','-' * 12, '+')
        print('|', 'name'.center(20),'|','age'.center(10), '|', 'score'.center(12), '|')
        print('+','-' * 20,'+','-' * 10,'+','-' * 12, '+')
        #此处打印所有学生的信息
        #把学生的数据取出来,用k绑定对应的字典
        for k in L:
            #将姓名格式变成20宽度居中的字符串
            center_name = k['name'].center(22)
            #先将年龄转换为字符串
            str_age = str(k['age'])
            center_age = str_age.center(12)
            str_score = str(k['score'])
            center_score = str_score.center(14)
            #print('|',center_name, '|', center_age, '|', center_score, '|')
            line = "|%s|%s|%s|" % (center_name, center_age, center_score)
            print(line)
        print('+','-' * 20,'+','-' * 10,'+','-' * 12, '+')
    
    def main():
        docs = input_student()
        output_student(docs)
        print('请再添加几个学生信息..')
        docs += input_student()
        print('添加之后的学生信息是')
        output_student(docs)
    
    main
  • 相关阅读:
    objective-c 自定义归档
    GitHub---最简单的使用
    objective-c 单例
    objective-c 通知(Notification)
    objective-c 谓词
    objective-c KVO
    objective-c KVC
    objective-c 协议(Protocol)和代理(Delegate)
    Xcode一些方便的快捷键
    objective-c 类目(Category)和延展(Extension)
  • 原文地址:https://www.cnblogs.com/pineliao/p/12096417.html
Copyright © 2011-2022 走看看