1.为什么要使用函数?
减少代码的冗余
2.函数先定义后使用(相当于变量一样先定义后使用)
3.函数的分类:
内置函数:python解释器自带的,直接拿来用就行了
自定义函数:根据自己的需求自己定义的函数
  def func(): #函数名打印出来的是内存地址
    '''注释'''
    函数体
4.函数定义都干了些什么事?
只检测语法,不执行代码
5.函数就是一段功能,尽量把函数名定义的有意义
6.定义函数的三种方式:
  有参数的函数:就是接受外部传进来的值,进行一系列的运算,最后吧结果返回出来
  无参数的函数:通常只是做一下操作而已
  空函数:什么事情都不做就是一个空函数(即便是一个空函数,他也会有如下属性)
7.函数的返回值:可返回任意类型的值
  什么时候需要有返回值:具体情况具体分析
  什么时候没有返回值:具体情况具体分析
8.yield和return的区别
  yield 停在那呢,挂起了
  yield 能返回多次值;return 返回一次值
  yield 保存函数状态
9.函数的调用:函数名加()
10.函数参数
  形参:定义函数时括号内写的参数
  形参在定义阶段是不占内存空间的,在调用的时候才占用内存空间
  实参:在调用函数时括号内传进来的值
函数参数的具体用法
  1.位置参数:
    1.按照位置传参
      按位置定义的形参必须要传值
      按位置定义的实参按照位置与形参一一对应的传
    2.按照关键字传数:按照key=value的形式定义的实参,传的时候与位置没有关系
      def foo(x,y):
        pass
      foo(1,2) #与形参一一对应
      foo(y=2,x=1) #关键字参数,指名道姓的传
      foo(1,y=2) #混用位置实参和关键字实参
           #混着用时:注意:1.不能给同一个形参重复赋值
                    2.位置实参必须在关键字实参的前面
  2.默认参数:在定义阶段就已经为形参赋值了,意味着在调用阶段就可以不为默认参数传值
        如果给默认参数传值了,就把一开始设置的给替换了。
    默认参数定义的场景:大多数都是男性,女性很少时就可以设置个默认,当然还有其他场景
    注意:1.默认参数必须在位置形参后面
       2.默认参数的值只在函数定义阶段生效一次,定义之后的修改不会影响它的值
       3.默认参数不要弄成可变类型的,就像是列表,就是一个坑
  3.动态参数
    可变长度的参数(长度指的是参数的个数):参数*,**
    1.*会把多出来的值传给z,并且以元组的形式返回   
    2.**会把多出来的值传给z,并且以字典的形式返回
    3.在实参中只要碰到*(),就是打散了
     只要是可迭代的就可以用*
     *就相当于for循环的操作,遇到*先打散
     *args,**kwargs(可传任意值)
可变长度的参数:从实参的角度推算出形参对应的形式*和**
针对按照位置定义的实参多出来的那部分,会被形参中的*处理,并且保存成元组的形式复制给args
针对按照关键字定义的实参多出来的那部分,会被形参中的**处理,并且保存成字典的形式复制给kwargs
# 1.举例一、
def foo(x,y,*args):
print(x,y)
print(args)#args相当于(3, 4, 5, 6, 7, 8, 9),那么*args相当于*(3, 4, 5, 6, 7, 8, 9)
print(args[0])
print(*args) # 加个*就是把上面的元组给打散了,就还是和原来传实参的时候的形式一样了 foo(1,2,3,4,5,6,7,8,9)
foo(1,2,3,*(4,5,6,7,8,9)) #也可以这样传 就相当于foo(1,2,3,4,5,6,7,8,9) # 2.举例二、
def bar(x,y,z):
print(x,y,z)
bar(1,2,3)
bar(*['b','a','c']) #bar('b','a','c')
bar(*'hel') #bar('h','e','l')
bar(*{'a':1,'b':2,'c':3}) #bar('b','a','c')
# 强调:如果实参中出现了*和**,第一时间打散了去看 # 3.举例三、
def foo(x,y,**kwargs):
print(x,y)
print(kwargs) #{'c': 3, 'd': 4, 'f': 6} 吧多余的元素以字典的形式返回了
print(*kwargs) #输出c d f ,就是把字典打散了
#
# foo(1,y=2,c=3,d=4,f=6) # 4.举例四、
def index(x,y,z=1):
print(x,y,z)
def wrapper(*args,**kwargs):
index(args,kwargs)
index(*args, **kwargs) #就是打散了
wrapper(1,2,3)
wrapper(1,2)
wrapper(x=1,y=2)
wrapper(1,y=2)
'''可变长度的参数:从实参的角度推算出形参对应的形式 * 和 **
针对按照位置定义的实参冗余的部分,会被形参中的 * 保存成元组的形式赋值给args
针对按照关键定义的实参冗余的部分,会被形参中的 ** 保存成字典的形式赋值给kwargs
强调:
如果实参中出现了 * 和 **,第一时间打散了去看。
'''

  

强调:
如果实参中出现了*和**,第一时间打散了去看 11.命名关键字参数(了解):在定义阶段,在*之后定义的形参称为命名关键字参数
特点是:在调用阶段,该参数必须以关键字的形式被传值
def foo(x,y,*,a,b):
print(x)
print(y)
print(a)
print(b)
foo(1,2,b=20,a=10)
控制函数调用的时候必须以关键字传参的时候就用命名关键字传参

  

  

python 函数相关定义的更多相关文章

  1. Python函数相关

    Python中的函数也是一种对象,而且函数还是一等公民.函数能作为参数,也能作为返回值,这使得Python中的函数变得很灵活.想想前面两篇中介绍的通过内嵌函数实现的装饰器和闭包. 下面就介绍一下Pyt ...

  2. python类定义与c#的一些区别

    c#中可以定义一个空类,但是python中定义空类需要加pass class EmptyClass(object): pass python的lei是多继承   python子类继承了基类,如果子类也 ...

  3. Python(2)深入Python函数定义

    Python学习 Part2:深入Python函数定义 在Python中,可以定义包含若干参数的函数,这里有几种可用的形式,也可以混合使用: 1. 默认参数 最常用的一种形式是为一个或多个参数指定默认 ...

  4. python之定义参数模块argparse(二)高级使用 --传参为函数的实现

    我们在文章python之定义参数模块argparse的基本使用中介绍了argparse模块的基本使用方法 当前传入的参数只能是int.str.float.comlex类型,不能为函数,这有点不方便,但 ...

  5. Python函数定义和使用

    函数是一段可以重复多次调用的代码,通过输入的参数值,返回需要的结果.通过使用函数,可以提高代码的重复利用率.本文主要介绍Python函数的定义.调用和函数参数设置方法. 函数的定义 Python函数定 ...

  6. 编程入门python之定义函数【转】

    编程入门python之定义函数 零基础学编程by学哥 2017-02-06 10:51 今天讲python函数. 输入参数求三角形或圆形或长方形的面积 先输入1个参数:形状类型 1=三角形 2=圆形 ...

  7. Python学习-10.Python函数定义(二)

    在Python中定义函数的时候,可以使用参数默认值的方式定义函数 例子: def welcome(who,state='is',action='talking'): print(who,state,a ...

  8. Python数据定义

    数据类型: 什么是数据? 在计算机科学中,数据是指所有能输入到计算机并被计算机程序处理的符号的介质的总称,是用于输入电子计算机进行处理,具有一定意义的数字字母.符号和模拟量等的统称.现在计算机存储和处 ...

  9. Python 函数定义以及参数传递

    Python 函数定义以及参数传递1.函数定义#形如def func(args...): doSomething123以关键字def 开头,后面是函数名和参数下面是函数处理过程. 举例: def ad ...

随机推荐

  1. windows编译hadoop 2.x Hadoop-eclipse-plugin插件

    本文转载至:http://blog.csdn.net/congcong68/article/details/42098391 一.简介 Hadoop2.x之后没有Eclipse插件工具,我们就不能在E ...

  2. Liberty glance 新功能 healthcheck

    oslo.middleware‘s healthcheck http://specs.openstack.org/openstack/oslo-specs/specs/kilo/oslo-middle ...

  3. cern-cloud-architecture

    规模: 总体: 有26个Cell 一个数据中心运行控制节点,另外一个仅仅运行nova cell 统一,灵活 nova-api运行在VM中,当然需要至少一个部署在物理机上来启动VM. 每个cell只有一 ...

  4. java: file/outputStream/InputStream 复制文件

    java i/o 复制文件 public static void main(String[] args) throws Exception { // TODO 自动生成的方法存根 if(args.le ...

  5. 机器学习(八)—GBDT 与 XGBOOST

    RF.GBDT和XGBoost都属于集成学习(Ensemble Learning),集成学习的目的是通过结合多个基学习器的预测结果来改善单个学习器的泛化能力和鲁棒性.  根据个体学习器的生成方式,目前 ...

  6. ipconfig | find /i "ipv4"

    C:\Users\Bob>ipconfig|find /i "IPv"   本地链接 IPv6 地址. . . . . . . . : fe80::d495:6e3:6368 ...

  7. Linux中的固件加载例子

    AP6335模块(BCM4339)在上电运行时,是需要刷入固件的,其在普通WIFI模式和AP模式之间切换时,也是需要加载不同的固件的,其位于/system/etc/firmware/下面:fw_bcm ...

  8. mysql 授予远程连接直接访问

    不通过ssh通道,mysql 授予远程连接直接访问 语句 GRANT ALL PRIVILEGES ON *.* TO root@'%' IDENTIFIED BY '!DSJdg!' WITH GR ...

  9. deep learning (六)logistic(逻辑斯蒂)回归中L2范数的应用

    zaish上一节讲了线性回归中L2范数的应用,这里继续logistic回归L2范数的应用. 先说一下问题:有一堆二维数据点,这些点的标记有的是1,有的是0.我们的任务就是制作一个分界面区分出来这些点. ...

  10. MongoDB 高可用集群搭建(3.4)

      一.架构概况192.168.56.101192.168.56.102192.168.56.103OS为centos 7.2 架构图: 规划5个组件对应的端口号,由于每台机器均需要同时部署 mong ...