*args 的用法
*args 主要用于函数定义。 你可以将不定数量的参数传递给一个函数。
这里的不定的意思是:预先并不知道, 函数使用者会传递多少个参数给你, 所以在这个场景下使用这两个关键字。 *args 是用来发送一个非键值对的可变数量的参数列表给一个函数.
(args名称可换)
程序:
def test_var_args(f_arg, *argv):
print("first normal arg:", f_arg)
for arg in argv:
print("another arg through *argv:", arg)
test_var_args('yasoob', 'python', 'eggs', 'test')
结果:
first normal arg: yasoob
another arg through *argv: python
another arg through *argv: eggs
another arg through *argv: test
**kwargs 的用法
**kwargs 允许你将不定长度的键值对, 作为参数传递给一个函数。 如果你想要在一个函数里处理带名字的参数, 你应该使用**kwargs。(同样keargs名称可换)
程序:
def test_var_kwargs(**kwargs):
for a,b in kwargs.items():
print(a+'==='+b)
test_var_kwargs(name='morty')
输出
name===morty
在调用函数的时候使用 *args 和 **kwargs
也可以在调用函数的时候使用*args 和 **kwargs
*args程序:
def test_arg_kwargs(para1,para2,para3):
print("1"+para1)
print("2"+para2)
print("3"+para3)
shenmegui=('one','two','three')
test_arg_kwargs(*shenmegui)
输出:
1one
2two
3three
**kwargs程序
def test_arg_kwargs(para1,para2,para3):
print("1"+para1)
print("2"+para2)
print("3"+para3)
shenmegui={
'para1':'one','para2':'two','para3':'three'}
test_arg_kwargs(**shenmegui)
输出:
1one
2two
3three
那么如果你想在函数里同时使用所有这三种参数, 顺序是这样的:
some_func(fargs, *args, **kwargs)
调试(Debugging)
在命令行中打断点:
import pdb
def hellopdb():
pdb.set_trace()
print('i don\'t have time')
hellopdb()
运行后就进行debug模式,此时可进行如下命令操作:
- c: 继续执行
- w: 显示当前正在执行的代码行的上下文信息
- a: 打印当前函数的参数列表
- s: 执行当前代码行,并停在第一个能停的地方(相当于单步进入)
- n: 继续执行到当前函数的下一行,或者当前行直接返回(单步跳过)
单步跳过(next)和单步进入(step)的区别在于, 单步进入会进入当前行调用的函数内部并停在里面, 而单步跳过会(几乎)全速执行完当前行调用的函数,并停在当前函数的下一行。
生成器
- 可迭代对象
Python中任意的对象,只要它定义了可以返回一个迭代器的__iter__方法,或者定义了可以支持下标索引的__getitem__方法(这些双下划线方法会在其他章节中全面解释),那么它就是一个可迭代对象。简单说,可迭代对象就是能提供迭代器的任意对象。那迭代器又是什么呢?
- 迭代器
任意对象,只要定义了next(Python2) 或者__next__方法,它就是一个迭代器。就这么简单。现在我们来理解迭代(iteration)
- 迭代
用简单的话讲,它就是从某个地方(比如一个列表)取出一个元素的过程。当我们使用一个循环来遍历某个东西时,这个过程本身就叫迭代。现在既然我们有了这些术语的基本理解,那我们开始理解生成器吧。
- 生成器
生成器也是一种迭代器,但是你只能对其迭代一次。这是因为它们并没有把所有的值存在内存中,而是在运行时生成值。你通过遍历来使用它们,要么用一个“for”循环,要么将它们传递给任意可以进行迭代的函数和结构。大多数时候生成器是以函数来实现的。然而,它们并不返回一个值,而是yield(暂且译作“生出”)一个值。这里有个生成器函数的简单例子:
def generator_function():
for i in range(10):
yield i
for j in generator_function():
print(j)
输出