python函数,lambda表达式,三目运算,列表解析,递归
2016-09-09 11:27
309 查看
一、自定义函数
定义函数时,函数体不执行;只有在调用函数时,函数体才执行。函数的结构:
1. def
2. 函数名
3. 函数体
4. 返回值
如果没有声明返回值,返回值默认为None
5. 参数
形式参数
定义函数时出现的参数,称之为形式参数,有几个形参就写几个,eg. def func(args1,args2)
如果没有形式参数,就留空
实际参数
调用函数时传入的参数,称之为实际参数,又叫实参, eg. func('kaye',21)
默认参数
在定义函数时,通过name=value这种形式,指定形参的默认值,这种形参,我们称之为默认参数,eg. def func(args1, args2 = 'default')
默认参数必须放在形参列表的最后,如果有多个默认参数也都放在形参列表最后
关键字参数,又称指定参数
在调用函数时,通过name=value这种形式,将实参传递给指定的形参。这样的实参,我们称之为关键字参数、或指定参数,
通常,实参通过从左到右的位置顺序匹配形参;但是,如果传入了指定参数,优先按参数名称将实参匹配给形参
eg. def func(args1,args2), func(args2 = 21,args1 = 'kaye') 和 func(args1 = 'kaye', args2 = 21) 的传参效果是一样的
动态参数,又称可变参数
在定义函数时,使用*args的形式,意味着可以接收任意多个额外的位置相关的参数到元组中;使用**kwargs的形式,意味着可以接收任意多个额外的关键字参数到字典中
eg. func('kaye','leo','jack')
eg. func('kaye'=21,'leo'=25,'jack'=30)
在调用函数时,使用*args的形式,意味着我们可以在序列args(可以是列表、字符串、元组)中封装任意多个位置相关的对象,并且在将这个序列args传递给函数时,将序列args解包为分开的、单个的参数
eg. func(*['kaye','leo','jack']),相当于args被赋值为('kaye,'leo','jack'), args[0] = 'kaye', args[1] = 'leo',...
序列args中的元素可以是列表、字典、元组等等,由此可以获得多层嵌套的序列化数据类型
在调用函数时,使用**kwargs的形式,意味着我们可以在字典中封装任意多个关键字参数,,并且在将这个字典传递给函数时,将字典解包为分开的、单个的参数(键值对)
eg. func(**{'kaye':21,'leo':25,'jack':30})
kwargs从最外层看是字典,而字典的键值对可以是列表、字典、元组等等,由此可以获得多层嵌套的字典
keyword-only参数
在定义函数时,跟在*args或一个单独的*之后的所有参数(可以有1个也可以有多个),都称之为keyword-only参数
对于这种参数,在调用函数时,必须使用关键字参数传参
eg1. def f1(a,*b,c) => f1(1,'2,3,c=4)
eg2. def f2(a,*b,c,d) => f2(1,2,3,4,5,c=6,d=7)
万能参数,即混合模式
定义函数时,def func(*args, **kwargs),args接收任意多个位置相关的参数,kwargs接收任意多个关键字参数(键值对)
可以同时接收序列化数据类型(字典、元组、字符串)和字典,作为其传入参数
python内部使用以下步骤在赋值前进行参数匹配:
通过位置分配非关键字参数
通过匹配变量名分配关键字参数(即调用时的name=value)
其他额外的非关键字参数分配到*name元组中(即*args)
其他额外的关键字参数分配到**name字典中(即**kwargs)
用默认值分配给未得到分配的参数(即函数定义中的name=value)
6. 补充:
函数重新定义(以后再说函数重载)
def f1
def f1
python解释器从上到下执行命令,当函数被重新定义,调用该函数时会使用重新定义的这个函数
调用函数传入形参时,是传入了对实参的引用,也就意味着,调用函数时对形参的操作,是直接作用在实参上的,会引起实参的变化
全局变量
全局变量放在程序最前面,从实际作用上看相当于常量,应该全部大写
全局变量可以被所有函数直接读取
如果要在函数中对全局变量重新赋值,必须在变量名前面加上global
如果全局变量是字典/列表,要对字典列表中的元素进行增删改,则不需要加global,直接按平常代码写法书写即可。这是因为字典和列表是可变类型,每一次赋值和更改,都是在原地修改的!
注释
一定要写注释,让别人一看就知道这个函数是在完成什么功能
一般在函数定义第一行之后输入注释内容,用三个双引号括起来,"""comment"""
:param param1:
:return:...
二、三元运算(三目运算)
对简单的条件语句,可以用三元运算简写。三元运算只能写在一行代码里面
examples:
三、lambda表达式
对于简单的函数,也存在一种简便的表示方式,即:lambda表达式
四、列表解析、字典解析
五、递归
利用函数编写如下数列:
斐波那契数列指的是这样一个数列 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233,377,610,987,1597,2584,4181,6765,10946,17711,28657,46368...
定义函数时,函数体不执行;只有在调用函数时,函数体才执行。函数的结构:
1. def
2. 函数名
3. 函数体
def func_name(): 函数体
4. 返回值
如果没有声明返回值,返回值默认为None
def func_name(): pass return True def func_name(): myString = 'this is to test how to return' return mySting
5. 参数
形式参数
定义函数时出现的参数,称之为形式参数,有几个形参就写几个,eg. def func(args1,args2)
如果没有形式参数,就留空
实际参数
调用函数时传入的参数,称之为实际参数,又叫实参, eg. func('kaye',21)
默认参数
在定义函数时,通过name=value这种形式,指定形参的默认值,这种形参,我们称之为默认参数,eg. def func(args1, args2 = 'default')
默认参数必须放在形参列表的最后,如果有多个默认参数也都放在形参列表最后
关键字参数,又称指定参数
在调用函数时,通过name=value这种形式,将实参传递给指定的形参。这样的实参,我们称之为关键字参数、或指定参数,
通常,实参通过从左到右的位置顺序匹配形参;但是,如果传入了指定参数,优先按参数名称将实参匹配给形参
eg. def func(args1,args2), func(args2 = 21,args1 = 'kaye') 和 func(args1 = 'kaye', args2 = 21) 的传参效果是一样的
动态参数,又称可变参数
在定义函数时,使用*args的形式,意味着可以接收任意多个额外的位置相关的参数到元组中;使用**kwargs的形式,意味着可以接收任意多个额外的关键字参数到字典中
eg. func('kaye','leo','jack')
eg. func('kaye'=21,'leo'=25,'jack'=30)
在调用函数时,使用*args的形式,意味着我们可以在序列args(可以是列表、字符串、元组)中封装任意多个位置相关的对象,并且在将这个序列args传递给函数时,将序列args解包为分开的、单个的参数
eg. func(*['kaye','leo','jack']),相当于args被赋值为('kaye,'leo','jack'), args[0] = 'kaye', args[1] = 'leo',...
序列args中的元素可以是列表、字典、元组等等,由此可以获得多层嵌套的序列化数据类型
在调用函数时,使用**kwargs的形式,意味着我们可以在字典中封装任意多个关键字参数,,并且在将这个字典传递给函数时,将字典解包为分开的、单个的参数(键值对)
eg. func(**{'kaye':21,'leo':25,'jack':30})
kwargs从最外层看是字典,而字典的键值对可以是列表、字典、元组等等,由此可以获得多层嵌套的字典
keyword-only参数
在定义函数时,跟在*args或一个单独的*之后的所有参数(可以有1个也可以有多个),都称之为keyword-only参数
对于这种参数,在调用函数时,必须使用关键字参数传参
eg1. def f1(a,*b,c) => f1(1,'2,3,c=4)
eg2. def f2(a,*b,c,d) => f2(1,2,3,4,5,c=6,d=7)
万能参数,即混合模式
定义函数时,def func(*args, **kwargs),args接收任意多个位置相关的参数,kwargs接收任意多个关键字参数(键值对)
可以同时接收序列化数据类型(字典、元组、字符串)和字典,作为其传入参数
python内部使用以下步骤在赋值前进行参数匹配:
通过位置分配非关键字参数
通过匹配变量名分配关键字参数(即调用时的name=value)
其他额外的非关键字参数分配到*name元组中(即*args)
其他额外的关键字参数分配到**name字典中(即**kwargs)
用默认值分配给未得到分配的参数(即函数定义中的name=value)
6. 补充:
函数重新定义(以后再说函数重载)
def f1
def f1
python解释器从上到下执行命令,当函数被重新定义,调用该函数时会使用重新定义的这个函数
调用函数传入形参时,是传入了对实参的引用,也就意味着,调用函数时对形参的操作,是直接作用在实参上的,会引起实参的变化
全局变量
全局变量放在程序最前面,从实际作用上看相当于常量,应该全部大写
全局变量可以被所有函数直接读取
如果要在函数中对全局变量重新赋值,必须在变量名前面加上global
如果全局变量是字典/列表,要对字典列表中的元素进行增删改,则不需要加global,直接按平常代码写法书写即可。这是因为字典和列表是可变类型,每一次赋值和更改,都是在原地修改的!
注释
一定要写注释,让别人一看就知道这个函数是在完成什么功能
一般在函数定义第一行之后输入注释内容,用三个双引号括起来,"""comment"""
:param param1:
:return:...
二、三元运算(三目运算)
对简单的条件语句,可以用三元运算简写。三元运算只能写在一行代码里面
# 书写格式 result = 值1 if 条件 else 值2 # 如果条件成立,那么将 “值1” 赋值给result变量,否则,将“值2”赋值给result变量
examples:
result = 'the result if the if succeeds' if option == True else 'the result if the if fails and falls to the else part'
三、lambda表达式
对于简单的函数,也存在一种简便的表示方式,即:lambda表达式
# ###################### 普通函数 ###################### # 定义函数(普通方式) def func(arg): return arg + 1 # 执行函数 result = func(123) # ###################### lambda ###################### # 定义函数(lambda表达式) my_lambda = lambda arg : arg + 1 # 执行函数 result = my_lambda(123)
四、列表解析、字典解析
myList = [1,2,3,4] newList =[i*2 for i in myList] #经过列表解析后,newList = [2,4,6,8]
myList = [1,2,3,4] myDic = {i:i*2 for i in myList} #得到字典{1:2,2:4,3:6,4:8}
五、递归
利用函数编写如下数列:
斐波那契数列指的是这样一个数列 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233,377,610,987,1597,2584,4181,6765,10946,17711,28657,46368...
def func(arg1,arg2): if arg1 == 0: print arg1, arg2 arg3 = arg1 + arg2 print arg3 func(arg2, arg3) # 在当前函数定义中调用当前函数,体现了递归 func(0,1)
相关文章推荐
- Python 三目运算,列表解析,装饰器,迭代器和生成器
- 在正则表达式中进行判断(三目运算)
- Python 列表解析和生成器表达式
- (转)lambda表达式的解析(六) 成员访问表达式
- 可以解析公式的java类实例--可传入数值运算表达式、含变量的运算表达式
- 我的python学习之路--列表表达式及匿名函数lambda
- 超强正则表达式解析网页连接---可用于搜索引擎获得连接列表
- python 中的列表解析和生成表达式
- (转)lambda表达式的解析(四) 运算符表达式
- (转)lambda表达式的解析(三) 类型转换表达式
- Python 生成器函数,生成器表达式,迭代器,列表解析
- 【多位数】【多重括号】【带负数】【字符表达式运算】【使用递归】【不用栈实现】
- lambda表达式的解析(二) 常量表达式
- lambda表达式的解析(一) 序
- (转)lambda表达式的解析(五) Lambda表达式与闭包类型
- Python里有趣的列表解析和生成器表达式
- CYQ.Data 数据框架 V5 的语法糖 外置开源原理解析 [类似lambda表达式]
- lambda表达式的解析(四) 运算符表达式
- (转)lambda表达式的解析(八) 泛型调用及typeof操作
- 数据结构复习:栈队列 优先级队列 已经使用栈来解析和运算数学表达式