Pass算子python 函数

函数

  • 函数是代码的一种组织形式
  • 函数应该能完成一项特定的工作,而且一般一个函数只完成一项工作
  • 有些语言,分函数和过程两个概念,通俗解释是,有返回结果的是函数,无返回结果的叫过程,python不加以区分
  • 函数的使用
  • 函数使用需要先定义
  • 使用函数,俗称调用
  • 参数:负责给函数传递一些必要的数据或者信息
  • 形参(形式参数):在函数定义的时候用到的参数,没有具体值,只是一个占位符号
  • 实参(实际参数):在调用函数的时候输入的值
  • 返回值:调用函数的时候的一个执行结果
  • 使用return返回结果
  • 如果没有值需要返回,我们推荐使用return None表示函数结束
  • 函数一旦执行return,则函数立即结束
  • 如果函数没有return关键字,则函数默认返回None
  • 参考资料
  • python参考资料:headfirst python -> 零基础入门学习python(小甲鱼)、流畅的python -> 习题
  • 参数分类
  • 普通参数/位置参数
  • 默认参数
  • 关键字参数
  • 收集参数
  • 普通参数
  • c参见上例
  • 定义的时候直接定义变量名
  • 调用的时候直接把变量或者值放入指定位置
  • 默认参数
  • 形参带有默认值
  • 调用的时候,如果没有对相应形参赋值,则使用默认值
  • 关键字参数
  • 语法
  • 比较麻烦,但也有好处:
  • 不容易混淆,一般实参和形参只是按照位置一一对应即可,容易出错
  • 使用关键字参数,可以不考虑参数位置
  • 收集参数
  • 把没有位置,不能和定义是的参数位置相对应的参数,放入一个特定的数据结构中
  • 语法
  • 参数名args不是必须这么写,但是,推荐直接用args,约定俗成
  • 参数名args前需要有星号
  • 收集参数可以和其他参数共存
  • 把关键字参数按字典格式存入收集参数
  • 语法:
  • kwargs一般约定俗成
  • 调用的时候,把多余的关键字参数放入kwargs
  • 访问kwargs需要按字典格式访问
  • 收集参数,关键字参数,普通参数可以混合使用
  • 使用规则就是。普通参数和关键字参数优先
  • 定义的时候一般找普通参数,关键字参数,收集参数tuple,收集参数dict
  • 把参数放入List或者字典中,直接把List/dict中的值放入收集参数中
  • 语法:参考案例
  • 对dict类型进行解包
  • 需要用两个星号进行解包
  • 函数的文档的作用是对当前函数提供使用相关的参考信息
  • 文档的写法:
  • 在函数内部开始的第一行使用三引号字符串定义符
  • 一般具有特定格式
  • 参考案例
  • 文档查看
  • 使用help函数,形如 help(func)
  • 使用__doc__,查看案例
  1. # 定义一个函数
  1. # 只是定义的话不会执行
  1. # 1. def关键字,后跟一个空格
  1. # 2. 函数名,自己定义,起名需要遵循便令命名规则,约定俗成,大驼峰命名只给类用
  1. # 3. 后面括号和冒号不能省,括号内可以有参数
  1. # 4. 函数内所有代码缩进
  1. def func():
  1.     print("我是一个函数")
  1.     print("爱生活")
  1.    
  1. print("函数结束了")
  1. 函数结束了
  1. # 函数的调用
  1. # 直接写出函数名字,后面小括号不能省略,括号内内容根据情况
  1. func()
  1. 我是一个函数
  1. 爱生活
  1. # 函数定义
  1. def func():
  1.     print('A')
  1.     print('B')
  1. func()
  1. A
  1. B

函数的参数和返回值

  1. # 形参和实参的案例
  1. # 参数person只是一个符号
  1. # 调用的时候用另一个
  1. def hello(person):
  1.     print("{},你好吗?".format(person))
  1.     return None
  1.    
  1. p = "小明"
  1. # 调用函数,需要把p作为实参传入
  1. hello(p)
  1. 小明,你好吗?
  1. p = "小五"
  1. hello(p)
  1. 小五,你好吗?
  1. pp = hello("小柒")
  1. print(pp)
  1. 小柒,你好吗?
  1. None
  1. # return案例
  1.  
  1. def hello(person):
  1.     print("{0},你好吗?".format(person))
  1.     return "提前结束!"
  1.     print(1)
  1.    
  1. p = "小明"
  1. rst = hello(p)
  1. print(rst)
  1. 小明,你好吗?
  1. 提前结束!
  1. # help负责随时为你提供帮助
  1. help(None)  # 等价于help(peint())
  1. Help on built-in function print in module builtins:
  1.  
  1. print(...)
  1.     print(value, ..., sep=' ', end='\n', file=sys.stdout, flush=False)
  1.    
  1.     Prints the values to a stream, or to sys.stdout by default.
  1.     Optional keyword arguments:
  1.     file:  a file-like object (stream); defaults to the current sys.stdout.
  1.     sep:   string inserted between values, default a space.
  1.     end:   string appended after the last value, default a newline.
  1.     flush: whether to forcibly flush the stream.
  1. # 九九乘法表
  1. # version 1.0
  1. for o in range(1, 10):  # 控制外循环 从 1 到 9
  1.     for i in range(1, o + 1):     # 内循环,每次从第一个数字开始,打印到跟行数相同的数量
  1.         print(o * i, end="  ")
  1.     print()
  1. 1 
  1. 2  4 
  1. 3  6  9 
  1. 4  8  12  16 
  1. 5  10  15  20  25 
  1. 6  12  18  24  30  36 
  1. 7  14  21  28  35  42  49 
  1. 8  16  24  32  40  48  56  64 
  1. 9  18  27  36  45  54  63  72  81 
  1. help(print)
  1. Help on built-in function print in module builtins:
  1.  
  1. print(...)
  1.     print(value, ..., sep=' ', end='\n', file=sys.stdout, flush=False)
  1.    
  1.     Prints the values to a stream, or to sys.stdout by default.
  1.     Optional keyword arguments:
  1.     file:  a file-like object (stream); defaults to the current sys.stdout.
  1.     sep:   string inserted between values, default a space.
  1.     end:   string appended after the last value, default a newline.
  1.     flush: whether to forcibly flush the stream.
  1. # 尝试用函数来打印九九乘法表
  1.  
  1. def jiujiu():
  1.     for o in range(1, 10):  # 控制外循环 从 1 到 9
  1.         for i in range(1, o + 1):     # 内循环,每次从第一个数字开始,打印到跟行数相同的数量
  1.             print(o * i, end="  ")
  1.         print()
  1.    
  1.     return None
  1.  
  1. jiujiu()
  1. jiujiu()
  1. 1 
  1. 2  4 
  1. 3  6  9 
  1. 4  8  12  16 
  1. 5  10  15  20  25 
  1. 6  12  18  24  30  36 
  1. 7  14  21  28  35  42  49 
  1. 8  16  24  32  40  48  56  64 
  1. 9  18  27  36  45  54  63  72  81 
  1. 1 
  1. 2  4 
  1. 3  6  9 
  1. 4  8  12  16 
  1. 5  10  15  20  25 
  1. 6  12  18  24  30  36 
  1. 7  14  21  28  35  42  49 
  1. 8  16  24  32  40  48  56  64 
  1. 9  18  27  36  45  54  63  72  81  
  1. # 改造上面函数
  1.  
  1. def printLine(line_num):
  1.     '''
  1.     line_num;代表行号
  1.    
  1.     打印一行九九乘法表
  1.     '''
  1.     for i in range(1, line_num + 1):
  1.         print(line_num * i, end=" ")
  1.        
  1.     print()
  1.  
  1. def jiujiu():
  1.     for o in range(1, 10):  # 控制外循环 从 1 到 9
  1.         printLine(o)
  1.     return None
  1.  
  1. jiujiu()
  1. 1
  1. 2 4
  1. 3 6 9
  1. 4 8 12 16
  1. 5 10 15 20 25
  1. 6 12 18 24 30 36
  1. 7 14 21 28 35 42 49
  1. 8 16 24 32 40 48 56 64
  1. 9 18 27 36 45 54 63 72 81

参数详解

  1. o         def 函数名(参数1,参数2.....:
  1. o             函数体
  1. o             
  1. o         # 调用
  1. o         函数名(value1value2......
  1. o         
  1. o         # 调用的时候,具体值参考的是位置,按位置赋值
  1. o         def func_name(p1=v1,p2=v2,........):
  1. o             func_block
  1. o         #调用1
  1. o         func_name()
  1. o         
  1. o         #调用2
  1. o         value1=100
  1. o         value2=200
  1. o         func_name(value1,value2)
  1. o         def func(p1=v1, p2=v2....):
  1. o             func_body
  1. o             
  1. o         被调函数;
  1. o         func(p1=value1, p2=value2....)
  1. ·              def func(*args):
  1. ·                  func_bady
  1. ·                  按照List使用方式访问args得到传入的参数
  1. ·                  
  1. ·              调用:
  1. ·              func(p1,p2,p3....)
  1. # 普通参数案例
  1.  
  1. def normal_para(one, two, three):
  1.     print(one + two)
  1.     return None
  1.  
  1. normal_para(1,2,3)
  1. 3
  1. # 默认参数案例1
  1.  
  1. def default_para(one, two, three=100):
  1.     print(one + two)
  1.     print(three)
  1.     return None
  1.    
  1. default_para(1,2)
  1. default_para(1,2,3)
  1. 3
  1. 100
  1. 3
  1. 3
  1. # 默认参数案例2
  1. # 报名函数,需要知道学生性别
  1. # 学习python的学生基本都是男生。所以,报名的时候如果没有特别指定,我们认为是男生
  1. def reg(name, age, gender="male"):
  1.     if gender == "male":
  1.         print("{0} is {1}, and he is a good student".format(name, age))
  1.     else:
  1.         print("{0} is {1}, and she is a good student".format(name, age))
  1. # 调用默认参数函数案例
  1.  
  1. reg("mingyue",21)
  1.  
  1. reg("xiaojing",23,"female")
  1. mingyue is 21, and he is a good student
  1. xiaojing is 23, and she is a good student
  1. # 关键字参数案例1
  1.  
  1. def keys_para(one, two, three):
  1.     print(one + two)
  1.     print(three)
  1.     return None
  1.  
  1. keys_para(one=1, two=2, three=30)
  1.  
  1. keys_para(three=30, two=2, one=1)
  1. 3
  1. 30
  1. 3
  1. 30
  1. # 关键字参数案例2
  1. def stu(name, age, addr):
  1.     print("I am a student")
  1.     print("我叫 {0}, 我今年 {1}岁了,我住{2}".format(name, age, addr))
  1.    
  1. n = "jingjing"
  1. a = 18
  1. addr = "我家"
  1.  
  1. # 普通参数,只按照位置传递,容易出错
  1. stu(a, n, addr)
  1.  
  1. def stu_key(name="No name", age=0, addr="No addr"):
  1.     print("I am a student")
  1.     print("我叫 {0}, 我今年 {1}岁了,我住{2}".format(name, age, addr))
  1.    
  1. n = "jingjing"
  1. a = 18
  1. addr = "我家"
  1.  
  1. # 普通参数,只按照位置传递,容易出错
  1. stu_key(name=n, age=a, addr=addr)
  1. I am a student
  1. 我叫 18, 我今年 jingjing岁了,我住我家
  1. I am a student
  1. 我叫 jingjing, 我今年 18岁了,我住我家
  1. # 收集参数案例
  1. # 函数模拟一个学生进行自我介绍,但具体内容不清楚
  1. # args把他看作一个List
  1. def stu( *args):
  1.     print("Hello 大家好,我自我介绍一下,简单说两句:")
  1.     # type函数作用是检测变量的类型
  1.     print(type(args))
  1.     for item in args:
  1.         print(item)
  1. stu("Liuying", 18, "北京大通州区", "wangxiaojing", "single")
  1.  
  1. stu("周大神")
  1. Hello 大家好,我自我介绍一下,简单说两句:
  1. <class 'tuple'>
  1. Liuying
  1. 18
  1. 北京大通州区
  1. wangxiaojing
  1. single
  1. Hello 大家好,我自我介绍一下,简单说两句:
  1. <class 'tuple'>
  1. 周大神
  1. # 收集参数案例
  1. # 说明收集参数可以不带任何参数调用,此时收集参数为空tuple
  1. stu()
  1. Hello 大家好,我自我介绍一下,简单说两句:
  1. <class 'tuple'>
  1. # 如果使用关键字参数格式调用,会出现问题
  1. stu(name="Liuying")

收集参数之关键字收集参数

  1. ·              def func( **kwargs):
  1. ·                  func_body
  1. ·                  
  1. ·              # 调用;
  1. ·              func(p1=v1, p2=v2, p3=v3....)
  1. # 收集参数案例
  1. # 自我介绍
  1. # 调用的时候需要使用关键字参数调用
  1. def stu( **kwargs):
  1.     # 在函数体内对于kwargs的使用不用带星号
  1.     print("Hello 大家好,我先自我介绍一下:")
  1.     print(type(kwargs))
  1.     # 对于字典的访问,python2 和python3有区别
  1.     for k,v in kwargs.items():
  1.         print(k, "---", v)
  1.  
  1. stu(name="Liuying", age=19, addr="北京大通州区" , lover="王晓静", work="Teaccher")
  1.  
  1. print("*" * 50)
  1.  
  1. stu(name="周大神")
  1. Hello 大家好,我先自我介绍一下:
  1. <class 'dict'>
  1. name --- Liuying
  1. age --- 19
  1. addr --- 北京大通州区
  1. lover --- 王晓静
  1. work --- Teaccher
  1. **************************************************
  1. Hello 大家好,我先自我介绍一下:
  1. <class 'dict'>
  1. name --- 周大神
  1. # 收集参数可以为空案例
  1. stu()
  1. Hello 大家好,我先自我介绍一下:
  1. <class 'dict'>

收集参数混合调用的顺序问题

  1. # 收集参数混合调用案例
  1. # stu模拟一个学生的自我介绍
  1. def stu(name, age,  *args, hobby="没有", **kwargs):
  1.     print("Hello 大家好")
  1.     print("我叫 {0}, 我今年 {1}岁了。".format(name, age))
  1.    if hobby == "没有":
  1.         print("我没有爱好,so sorry")
  1.     else:
  1.         print("我的爱好是{0}".format(hobby))
  1.        
  1.     print("*" * 20)
  1.    
  1.     for i in args:
  1.         print(i)
  1.        
  1.     print("#" * 30)
  1.    
  1.     for k,v in kwargs.items():
  1.         print(k, "---", v)
  1.        
  1. # 开始调用函数
  1. name = "Liuying"
  1. age = 19
  1.  
  1. # 调用的不同格式
  1. stu(name, age)
  1.  
  1. stu(name, age, hobby="游泳")
  1.  
  1. stu(name, age, "王晓静", "刘石头", hobby="游泳", hobby2="烹饪", hobby3="跟不同女生聊天")
  1. Hello 大家好
  1. 我叫 Liuying, 我今年 19岁了。
  1. 我没有爱好,so sorry
  1. ********************
  1. ##############################
  1. Hello 大家好
  1. 我叫 Liuying, 我今年 19岁了。
  1. 我的爱好是游泳
  1. ********************
  1. ##############################
  1. Hello 大家好
  1. 我叫 Liuying, 我今年 19岁了。
  1. 我的爱好是游泳
  1. ********************
  1. 王晓静
  1. 刘石头
  1. ##############################
  1. hobby2 --- 烹饪
  1. hobby3 --- 跟不同女生聊天

收集参数的解包问题

  1. # 收集参数的解包问题
  1.  
  1. def stu( *args):
  1.     print("哈哈哈哈")
  1.     # n 用来表示循环次数
  1.     # 主要用来调试
  1.     n = 0
  1.     for i in args:
  1.         print(type(i))
  1.         print(n)
  1.         n += 1
  1.         print(i)
  1.        
  1. # stu("Liuying", "Wangxiaojing", 19, 20)
  1.  
  1. l = ["Liuying", 19, 20, "Wangxiaojing"]
  1.  
  1. stu(l)
  1. # 此时,args的表示形式是字典内一个List类型的元素,即 args = (["Liuying", 19, 23, "Wangxiaojing",])
  1. # 很显然跟我们最初的想法违背
  1.  
  1. # 此时的调用,我们就需要解包符号,即调用的时候前面加一个星号
  1. stu(*l)
  1. 哈哈哈哈
  1. <class 'list'>
  1. 0
  1. ['Liuying', 19, 20, 'Wangxiaojing']
  1. 哈哈哈哈
  1. <class 'str'>
  1. 0
  1. Liuying
  1. <class 'int'>
  1. 1
  1. 19
  1. <class 'int'>
  1. 2
  1. 20
  1. <class 'str'>
  1. 3
  1. Wangxiaojing

同理,dict类型收集参数一样可以解包,但是

函数文档

  1. # 文档案例
  1.  
  1. def stu(name, age, *args):
  1.     '''
  1.     这是第一行
  1.     这是第二行
  1.     这是第三行
  1.     '''
  1.     print("This is hanshu stu")
  1.     pass
  1. # 查看函数文档
  1. help(stu)
  1. stu.__doc__
  1. Help on function stu in module __main__:
  1.  
  1. stu(name, age, *args)
  1.    这是第一行
  1.     这是第二行
  1.     这是第三行
  1. '\n    这是第一行\n    这是第二行\n    这是第三行\n    '
  1. def stu(name, age):
  1.     '''
  1.     这是文档的文字内容
  1.     :param name: 表示学生的姓名
  1.     :param age: 表示学生的年龄
  1.     :return: 此函数没有返回值
  1.     '''
  1.     pass
  1.  
  1. print(help(stu))
  1.  
  1. print("*" * 20)
  1.  
  1. print(stu.__doc__)
  1.  
  1. Help on function stu in module __main__:
  1.  
  1. stu(name, age)
  1.     这是文档的文字内容
  1.     :param name: 表示学生的姓名
  1.     :param age: 表示学生的年龄
  1.     :return: 此函数没有返回值
  1.  
  1. None
  1. ********************
  1.  
  1.     这是文档的文字内容
  1.     :param name: 表示学生的姓名
  1.     :param age: 表示学生的年龄
  1.     :return: 此函数没有返回值

 

Pass算子python 函数的更多相关文章

  1. python 函数之day3

    一 函数的语法及特性 什么是函数? 定义:函数是一个功能通过一组语句的集合,由名字(函数名)将其封装起来的代码块,要想执行这个函数,只要调用其函数名即可. 特性: 减少重复代码 使程序变的可扩展 使程 ...

  2. Python函数作用域的查找顺序

    函数作用域的LEGB顺序 1.什么是LEGB? L:local 函数内部作用域 E:enclosing 函数内部与内嵌函数之间 G:global 全局作用域 B:build-in 内置作用域 2.它们 ...

  3. Python函数信息

    Python函数func的信息可以通过func.func_*和func.func_code来获取 一.先看看它们的应用吧: 1.获取原函数名称: 1 >>> def yes():pa ...

  4. python函数基础 与文件操作

    函数的定义 函数是通过赋值传递的,参数通过赋值传递给函数.def语句将创建一个函数对象并将其赋值给一个变量名,def语句的一般格式如下: def function_name(arg1,arg2[,.. ...

  5. Python开发【第四章】:Python函数剖析

    一.Python函数剖析 1.函数的调用顺序 #!/usr/bin/env python # -*- coding:utf-8 -*- #-Author-Lian #函数错误的调用方式 def fun ...

  6. Python函数解析

    对于Python的函数,我们需要记住的是: 1. 函数的默认返回值是None. 2. python是一个自上而下逐行解释并执行的语言.因此,函数的定义必须在函数被调用之前.同名的函数,后定义的会覆盖前 ...

  7. Python入门笔记(18):Python函数(1):基础部分

    一.什么是函数.方法.过程 推荐阅读:http://www.cnblogs.com/snandy/archive/2011/08/29/2153871.html 一般程序设计语言包含两种基本的抽象:过 ...

  8. [Python学习笔记][第五章Python函数设计与使用]

    2016/1/29学习内容 第四章 Python函数设计与使用 之前的几页忘记保存了 很伤心 变量作用域 -一个变量已在函数外定义,如果在函数内需要修改这个变量的值,并将这个赋值结果反映到函数之外,可 ...

  9. python函数定义

    刚学用Python的时候,特别是看一些库的源码时,经常会看到func(*args, **kwargs)这样的函数定义,这个*和**让人有点费解.其实只要把函数参数定义搞清楚了,就不难理解了. 先说说函 ...

随机推荐

  1. Relatives(容斥)

    Relatives Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 15708   Accepted: 7966 Descri ...

  2. 源码篇:ThreadLocal的奇思妙想(万字图文)

    前言 ThreadLocal的文章在网上也有不少,但是看了一些后,理解起来总感觉有绕,而且看了ThreadLocal的源码,无论是线程隔离.类环形数组.弱引用结构等等,实在是太有意思了!我必须也要让大 ...

  3. 【ElasticSearch】ElasticSearch集群扫盲

    Cluster 集群 ⼀个 Elasticsearch 集群由⼀个或多个节点(Node)组成,每个集群都有⼀个共同的集群名称作为标识.   Node节点 ⼀个 Elasticsearch 实例即⼀个 ...

  4. LA3902网络

    题意:      给你一棵树,所有叶子节点都是客户端,其他的都是服务器,然后问你最少在多少个服务器上安装VOD能使所有的客户端都能流畅的看视频,流畅看视频的条件是每个客户端距离他最近的安装VOD的服务 ...

  5. hdu 3265 线段树扫描线(拆分矩形)

    题意:        给你n个矩形,每个矩形上都有一个矩形的空洞,所有的矩形都是平行于x,y轴的,最后问所有矩形的覆盖面积是多少. 思路:       是典型的矩形覆盖问题,只不过每个矩形上多了一个矩 ...

  6. hdu4994 博弈,按顺序拿球

    题意:       给你n堆东西,两个人博弈的去拿,每次最少一个,最多是一堆,必须按顺序那,也就是只有把第一堆的东西拿完了才能去拿第二堆东西,谁先拿完谁胜,问新手是否能胜利. 思路:       显然 ...

  7. android调用号和libc

    调用号(以arm平台为例)在/bionic/libc/kernel/uapi/asm-arm/asm/unistd.h: /* WARNING: DO NOT EDIT, AUTO-GENERATED ...

  8. 容器随Docker启动而启动

    在容器开启状态下 docker container update --restart=always 容器名

  9. ThinkPHP5查询-select与find理解

    出现问题 在tp5框架中判断select查询结果是否为空时,无论查询条件是否满足,判断查询结果都不为空 解析问题 select查询的是多条数据,若查询数据为空,则返回一个空的二维数组 array(ar ...

  10. window 下如何安装redis

    1.官方没有 Windows版本的 Redis,但是微软开发并维护了针对Win64的Windows版本. Windows版本下载地址:https://github.com/MicrosoftArchi ...