一、不定长参数

在函数定义中,经常会碰到*args 和**kwargs作为参数。

事实上在函数中,*和**才是必要的,args和kwargs可以用其他名称代替

*args 是指不定数量的非键值对参数。 

**kwargs是指不定数量的键值对参数。

*args 作为作为元组匹配没有指定参数名的参数。

而**kwargs作为字典,匹配指定了参数名的参数。

*args 必须位于**kwargs 之前。

1、可变参数、参数组,*args    
   # 1、不是必填参数;
# 2、不限制参数的个数:
# 3、传入多个参数的时候,他把参数放到一个元组里面
def send_report(*args): #可变参数、参数组
print('发邮件')
print(args)
# for a in args:
# print(a) send_report()#不传 打印结果为发邮件 ()
send_report(1)#传一个 打印结果为 发邮件 (1,)
send_report(1,2,3,4,5)#传多个 打印结果为 发邮件 (1,2,3,4,5)
2、关键字参数,**kwargs
# 1、不是必填参数;
# 2、不限制参数的个数:
# 3、传入多个参数的时候,他把参数放到一个字典里面
# 4、必须得使用关键字调用,k=v,k1=v1
def send_report2(**kwargs): #关键字参数
print('发邮件')
print(kwargs) send_report2()#不传 打印结果为 发邮件 {}
#send_report2(1)#会报错
send_report2(name='xiaohei',age=18)#字典 打印结果为 发邮件 {'name':'xiaohei','age':18}
3、调用函数的时候:
关键字参数后面不能再写位置参数了。
*args 调用不能传k=v格式的
**kwargs 调用必须写k=v格式的
def myfunc(name,addr,phone,qq,email):
print(name,addr,phone,qq,email) myfunc(phone=110,addr='beijing',qq='',email='134@163.com',name='xxx')#使用关键字调用
myfunc('hanmin',phone=110,addr='beijing',qq='',email='134@163.com')#第一个用的位置参数,剩下的是关键字参数
#myfunc('哈哈哈',addr='beijing','qqq',email='134@163.com',name='xxx')#此种方法错误,关键字参数后面不能再用位置参数 def myfunc1(name,addr='beijing',*args):
# print(name,addr,args)
print('name:',name)
print('addr:',addr)
print('args:',args) myfunc1('xiaohei','xiaobai')#xiaobai给了addr args为()
# myfunc1('xiaohei',addr='shanghai',args=(1,2,3))#错误,使用关键字调用,args无法传值
myfunc1('xiaohei','shanghai','hhh','bbb')#args:('hhh', 'bbb') def myfunc2(name,addr='beijing',**kwargs):
print('name',name)
print('addr',addr)
print('kwargs',kwargs) myfunc2(name='xiaobai',addr='shanghai',age=18,sex='nv')#kwargs: {'age': 18, 'sex': 'nv'} def myfunc3(name,addr='beijing',*args,**kwargs):
print('name:',name)
print('addr:',addr)
print('args:',args)
print('kwargs:',kwargs) myfunc3(name='xiaohei',addr='shanghai',age=18,sex='nv')#k=v形式的会传给kwargs args: () kwargs: {'age': 18, 'sex': 'nv'}
myfunc3('xiaohei','chengdu','chongqing',country='china')#chongqing传给args;country='china'传给kwargs args: ('chongqing',) kwargs: {'country': 'china'}

二、全局变量、局部变量

1、全局变量:
大家都可以用的变量就是全局变量
不可变的数据类型是全局变量的话,必须得加global:
int(整型) str(字符串) tuple(元组)
可变的数据类型是全局变量的话,不需要加global:
dict(字典) list(列表) set(集合)
  全局变量一般定义在最上面,尽量少用全局变量,会占内存,不安全 2、局部变量: 函数里面定义的变量都是局部变量,出了函数后无法使用
language = 'Python'#全局变量

def hello():
language='Java'#局部变量,作用域在函数里面
print(language) hello() #结果取局部变量Java def xiaobai():
print(language)
xiaobai() # 结果仍取全局变量Python def change():
global language #修改全局变量
language = 'C#'
print(language) change() #结果取修改后的全局变量 C#

(1)参数传递一个正确的例子:

money=500
def test(consume):
return money - consume def test1(money):
return test(money) + money money = test1(money)
print(money)#结果为500

(2)参数传递一个错误的例子:

def test():
global a
a = 5 def test1():
c = a + 5
return c
# 若想执行正确则在此处加test()
res = test1()
print(res)

函数需要先调用才能执行

Python 不定长参数、全局变量、局部变量 day4的更多相关文章

  1. python不定长参数 *argc,**kargcs(19)

    在 python函数的声明和调用 中我们简单的了解了函数的相关使用,然而在函数传递参数的时候,我们埋下了一个坑,关于不定长参数的传递我们还没有讲,今天这篇文章主要就是讲解这个问题. 一.函数不定长参数 ...

  2. python 不定长参数

    1 #不定长参数 * 元祖 ** 字典 2 def item(a,b,*c,**d): 3 print(a) 4 print(b) 5 print(c) 6 print(d) 7 8 item(11, ...

  3. python 不定长参数**kwargs

  4. python 不定长参数*args

  5. 详解Python函数参数定义及传参(必备参数、关键字参数、默认可省略参数、可变不定长参数、*args、**kwargs)

    详解Python函数参数定义及传参(必备参数.关键字参数.默认可省略参数.可变不定长参数.*args.**kwargs) Python函数参数传参的种类   Python中函数参数定义及调用函数时传参 ...

  6. python函数中的不定长参数

    python自定义函数中有两中不定长参数,第一种是*name,第二种是**name.加了星号 * 的参数会以元组(tuple)的形式导入,存放所有未命名的变量参数.加了两个星号 ** 的参数会以字典的 ...

  7. python笔记(2)---不定长参数

    python自定义函数中有两种不定长参数, 第一种是*name:加了星号 * 的参数会以元组(tuple)的形式导入 第二种是**name:加了星号 * *的参数会以字典(dict)的形式导入 *na ...

  8. python函数中的参数(关键字参数,默认参数,位置参数,不定长参数)

    默认参数:定义函数的时候给定变量一个默认值. def num(age=1): 位置参数:调用函数的时候根据定义函数时的形参位置和实参位置进行引用. 关键字参数:如果定义的函数中含有关键字参数,调用函数 ...

  9. python中函数的不定长参数

    例1: #定义一个含有不定长参数的函数,本例第三个参数*args def sum_nums(a,b,*args): print('_'*30) print(a) print(b) print(args ...

随机推荐

  1. hive学习笔记-表操作

    Hive数据类型 基本数据类型 tinyint,smallint,int,biging,float,double,decimal,char,varchar,string,binary,boolean, ...

  2. 用JavaScript截图

    用JavaScript截图   使用JavaScript截图,这里我要推荐两款开源组件:一个是Canvas2Image,它可以将Canvas绘图编程PNG/JPEG/BMP的图像:但是光有它还不够,我 ...

  3. 改善java程序的151个建议--数组和集合

    60.性能考虑,数组是首选,在基本类型处理方面.数组还是占优势的,并且集合类的底层也都是通过数组实现.建议在性能要求较高的场景中使用数组替代集合. 61.假设有必要.使用变长数组:我们能够通过对数组扩 ...

  4. Magento 模块开发之DispatchEvent

    在这一章节中.我们来了解 Magento 中的事件分发机制 Mage::dispatchEvent() 在创建自己的模块时, Event 事件的分发将会变成十分实用且有效 以个人的经验. 事件的分发使 ...

  5. Longest Increasing Subsequence HDU - 6284

    /* 首先预处理好f g数组 fi :以a[i]为结尾的 最长上升子序列的长度 gi :以a[i]为开始的 最长上升子序列的长度 mxx : 最长上升子序列的长度 线段树优化 nlogn (不包含a[ ...

  6. js对象和json的区别

    他们两个没有什么关联只不过可以相互转换而已,就像json可以转化为java对象一样 注意:json只有字符串形式(就是我们常说的json字符串:key/value值和数组形式的字符串),没有什么jso ...

  7. c++中读写文件操作

    读写文件这个,不常用,每次用的时候都会百度一下,每次写法还都不一样,所有总是记混.今天利用点时间总结下之前工程中用过的.以后就安照这种方法写了. 搞acmicpc的时候喜欢用freopen(),这个是 ...

  8. C#在WinForm中使用WebKit传递js对象实现与网页交互的方法

    这篇文章主要介绍了C#在WinForm中使用WebKit传递js对象实现与网页交互的方法,涉及针对WebBroswer控件及WebKit控件的相关使用技巧,需要的朋友可以参考下 本文实例讲述了C#在W ...

  9. 洛谷P2516 [HAOI2010]最长公共子序列

    题目描述 字符序列的子序列是指从给定字符序列中随意地(不一定连续)去掉若干个字符(可能一个也不去掉)后所形成的字符序列.令给定的字符序列X="x0,x1,-,xm-1",序列Y=& ...

  10. hibernate中id中的 precision 和 scale 作用

    转自:https://www.cnblogs.com/IT-Monkey/p/4077570.html <hibernate-mapping>     <class name=&qu ...