python学习之函数(二)
4.4.6 动态传参
动态传参是针对形参而言
1.动态位置参数
在静态位置参数时,我们知道,定义函数时有几个位置参数,调用时就必须给几个实参,不能多也不能少。有时候,实际应用过程中,参数往往不能固定,就好像吃饭,食物是不确定的,你可以吃三菜一汤,你也可以吃两荤两素一汤,当遇到参数不能固定时,就需要我们的动态参数出场了。
语法:def 函数名(*args)
*args--接受到的元素以元组的形式保存。动态参数实质上还是位置参数
def hero (*args):
print('德玛西亚:',args)
hero('皇子','盖伦','赵信')
hero('皇子','盖伦')
hero('皇子',)
2.位置参数与动态参数
混用规则:
·动态参数必须在位置参数后⾯,防止所有实参都被动态参数接收后位置参数因没有数据而报错
def hero (a,b,*args):
print(a,b,'--',args)
hero('皇子','盖伦','赵信')
hero('皇子','盖伦','赵信','女警')
#输出
皇子 盖伦 -- ('赵信',)
皇子 盖伦 -- ('赵信', '女警')
·动态参数实质上还是位置参数,所以关键字参数要放在动态参数之后
def hero (*args,a,b):
print(a,b,'--',args)
hero('皇子',a ='盖伦',b='赵信')
hero('皇子','盖伦',b='赵信',a ='女警')
#输出
盖伦 赵信 -- ('皇子',)
女警 赵信 -- ('皇子', '盖伦')
·动态参数要在默认值参数之前
顺序:位置参数 >>> 动态参数 >>> 默认参数 >>> 关键字参数
3.动态关键字参数
语法:def 参数名(**变量名)
**:系统会自动把所有的关键字参数集合成字典
4.形参实参的拆散与聚合
*实参:解构可迭代对象
*形参:聚合元素成元组 --没有元素时也会对得到一个空的元组
**实参:解构可迭代对象
**形参:聚合元素成字典,(没有元素时得到的是一个空的字典)参数的变量名作为字典的key,参数的值作为字典的value;这里要注意的是不能忘记变量名的命名规则,数字可以作为字典的key存在,但是不能作为变量名使用。
**仅适用于关键字参数
#聚合---------------------------
def hero (*args):
print(args)
lst = ['皇子','盖伦','赵信','女警']
s = 'asdf'
hero(lst)
#输出---(['皇子', '盖伦', '赵信', '女警'],)
#解构-----------------------------
hero(*lst,*s)
#输出---('皇子', '盖伦', '赵信', '女警', 'a', 's', 'd', 'f')
#聚合--------------------------
def hero (**kwargs):
print(kwargs)
hero(h1='皇子',h2='盖伦',h3='赵信')
#输出---{'h1': '皇子', 'h2': '盖伦', 'h3': '赵信'}
#解构---------------------
def hero (**kwargs):
print(kwargs)
dic = {h1:'皇子',h2:'盖伦',h3:'赵信',h4:'女警'}
hero(**dic)
#输出---{'h1': '皇子', 'h2': '盖伦', 'h3': '赵信', 'h4': '女警'}
*的灵活使用:
函数中分为打散和聚合。
函数外可以处理剩余的元素,得到的是列表,即使没有元素填充,也是一个空列表
#分别赋值
a,b = (1,2)
print(a,b) #输出 1 2
#利用*解构赋值
a,*b = (1,2,3,4)
print(a,b) #输出 1 [2, 3, 4]
*a,b,c = range(5)
print(a,b,c) #输出 [0, 1, 2] 3 4
#利用*进行聚合
a = 1
b = 2
c = [3,4,5]
print(a,b,c) #输出 1 2 [3, 4, 5]
最终顺序:位置参数 >> *动态位置参数 >> 默认参数 >> 仅限关键字参数 >>**kwargs 默认参数 与 仅限关键字参数 的位置可以互换
##name是仅限关键字参数
def func(a,b,*args,team='德玛西亚',name,**kwargs):
print(a)
print(b)
print(args)
print(team)
print(name)
print(kwargs)
func(1,2,3,4,name='gailun',equi='日炎',skill='啥蹦地裂',flag='旗子')
4.4.7 命名空间与作用域
分类:
内置命名空间:python自己使用的空间,比如list、str之类
全局命名空间:我们直接在py⽂件中, 函数外声明的变量都属于全局命名空间
局部命名空间:在函数中声明的变量会放在局部命名空间
加载顺序:
内置命名空间 》 全局命名空间 》 局部命名空间
取值顺序:
就近原则,在没有任何方法的作用下,取值顺序是单向不可逆的
局部命名空间 》 全局命名空间 》 内置命名空间
作用域:
作用域就是作用范围, 按照生效范围来看分为全局作用域和局部作用域。
全局作用域:包含内置命名空间和全局命名空间,在整个文件的任何位置都可以使用,按照程序从上到下逐行执行;
局部作用域: 局部命名空间;在函数内部可以使⽤;
我们可以通过globals()函数来查看全局作⽤域中的内容, 也可以通过locals()来查看局部作⽤域中的变量和函数信息。
globals(): 以字典的形式返回全局作用域所有的变量对应关系。
locals(): 以字典的形式返回当前作用域的变量的对应关系。
4.4.8函数的嵌套
#感受一下
def fun1():
print(2)
def fun2():
print(4)
print(3)
fun2()
print(5)
print(1)
fun1()
print(6)
#输出1 2 3 4 5 6
关键点:只要遇见了 函数名() 就是函数的调用,如果没有就不是函数的调用,只有调用了才能有结果。
4.4.9 关键字 global、nonlocl
1.global:
·在局部作用域中可以更改全局作用域的变量;
·利用global在局部作用域也可以声明一个全局变量。
a = 1
def func():
print(a)
func() #输出 1
def fun1():
a += 1 #报错
print(a)
局部作用域对全局作用域的变量(此变量只能是不可变的数据类型)只能进行引用,而不能进行改变,只要改变就会报错,使用global可以解决这一问题:
#全局下已经定义了变量
a = 1
def fun1():
global a
a += 1
print(a)
fun1() #输出 2
#全局下没有点定义变量
def func():
global a
a = 3
func()
print(a) #输出为 3
2.nonlocal:
nonlocal是python3新加的功能,与global用法差不多,就是在局部作用域如果想对父级作用域的变量进行改变时,需要用到nonlocal。
def add_b():
b = 42
def dd_nonlocal():
nonlocal b
b = b + 20
print(b)
dd_nonlocal() #输出为 62
print(b)
add_b() #因为nonlocal已经更改了b的值,所以也是62
python学习之函数(二)的更多相关文章
- python学习8—函数之高阶函数与内置函数
python学习8—函数之高阶函数与内置函数 1. 高阶函数 a. map()函数 对第二个输入的参数进行第一个输入的参数指定的操作.map()函数的返回值是一个迭代器,只可以迭代一次,迭代过后会被释 ...
- python学习7—函数定义、参数、递归、作用域、匿名函数以及函数式编程
python学习7—函数定义.参数.递归.作用域.匿名函数以及函数式编程 1. 函数定义 def test(x) # discription y = 2 * x return y 返回一个值,则返回原 ...
- Python学习笔记(二)——列表
Python学习笔记(二)--列表 Python中的列表可以存放任何数据类型 >>> list1 = ['Hello','this','is','GUN',123,['I','Lov ...
- Python学习笔记(二):条件控制语句与循环语句及常用函数的用法
总结的内容: 1.条件控制语句 2.while循环语句 3.for循环语句 4.函数的用法 一.条件控制语句 1.介绍 Python条件语句是通过一条或多条语句的执行结果(True或者False)来决 ...
- 【Python学习笔记之二】浅谈Python的yield用法
在上篇[Python学习笔记之一]Python关键字及其总结中我提到了yield,本篇文章我将会重点说明yield的用法 在介绍yield前有必要先说明下Python中的迭代器(iterator)和生 ...
- Python学习系列(二)(基础知识)
Python基础语法 Python学习系列(一)(基础入门) 对于任何一门语言的学习,学语法是最枯燥无味的,但又不得不学,基础概念较繁琐,本文将不多涉及概念解释,用例子进行相关解析,适当与C语言对比, ...
- Python学习笔记 - 函数参数
>>> def power(x): ... return x * x ... >>> power(5) 25 >>> def power(x, n ...
- 从0开始的Python学习007函数&函数柯里化
简介 函数是可以重用的程序段.首先这段代码有一个名字,然后你可以在你的程序的任何地方使用这个名称来调用这个程序段.这个就是函数调用,在之前的学习中我们已经使用了很多的内置函数像type().range ...
- python之内置函数(二)与匿名函数、递归函数初识
一.内置函数(二)1.和数据结构相关(24)列表和元祖(2)list:将一个可迭代对象转化成列表(如果是字典,默认将key作为列表的元素).tuple:将一个可迭代对象转化成元组(如果是字典,默认将k ...
- python学习Day10 函数的介绍(定义、组成、使用)
今日学习内容: 1.什么是函数 :函数就是一个含有特定功能的变量,一个解决某问题的工具 函数的定义:通过关键字def + 功能名字():代码体(根据需求撰写代码逻辑) 2.为什么要用函数:可以复用:函 ...
随机推荐
- JavaScript面向对象OOM 2(JavaScript 创建对象的工厂模式和构造函数模式)
在创建对象的时候,使用对象字面量和 new Object() 构造函数的方式创建一个对象是最简单最方便的方式.但是凡是处于初级阶段的事物都会不可避免的存在一个问题,没有普适性,意思就是说我要为世界 ...
- jdk1.8环境变量配置
JAVA_HOME=/usr/java/jdk1.8.0_45PATH=$JAVA_HOME/bin:$PATHCLASSPATH=.:$JAVA_HOME/jre/lib/ext:$JAVA_HOM ...
- python继承小demo
# -*- coding: utf-8 -*- """ 继承的意义:实现代码重用,数据函数都可以重用 子类覆盖,子类与父类同名 选择性继承 super().__init_ ...
- 使用IDEA搭建一个 Spring + Spring MVC + Mybatis 的Web项目 ( 零配置文件 )
前言: 除了mybatis 不是零配置,有些还是有xml的配置文件在里面的. 注解是Spring的一个构建的一个重要手段,减少写配置文件,下面解释一下一些要用到的注解: @Configuration ...
- http学习--常用请求方法和响应状态码
常用的http请求方法: GET方法:请求服务器资源,并返回 POST方法:向指定资源提交数据进行处理请求(比如说表单,上传文件等).数据被包含在请求体中.POST请求可能会导致新的资源建立或已有资源 ...
- MaxCompute - ODPS重装上阵 第六弹 - User Defined Type
MaxCompute(原ODPS)是阿里云自主研发的具有业界领先水平的分布式大数据处理平台, 尤其在集团内部得到广泛应用,支撑了多个BU的核心业务. MaxCompute除了持续优化性能外,也致力于提 ...
- .net core 下载文件 其他格式
app.UseStaticFiles(); app.UseStaticFiles(new StaticFileOptions { //FileProvider = new PhysicalFilePr ...
- [深度学习] pytorch学习笔记(4)(Module类、实现Flatten类、Module类作用、数据增强)
一.继承nn.Module类并自定义层 我们要利用pytorch提供的很多便利的方法,则需要将很多自定义操作封装成nn.Module类. 首先,简单实现一个Mylinear类: from torch ...
- Ajax异步传值总结
Ajax异步传值 将数据从前台传向后台: 1:通过get方式,将参数在链接中,配合“?”进行传值. 实例: //前台传值方法 //触发该方法调用ajax function testAjax(yourD ...
- 第一次的迷宫为队列版,这个为搜索版x(自己写的嘿嘿)
错误原因:第一次提交的时候把Yes跟No输错了都输为大写:…… 代码来啦! #include<cstdio> #include<iostream> using namespac ...