python函数,lambda表达式,三目运算,列表解析,递归
一、自定义函数
定义函数时,函数体不执行;只有在调用函数时,函数体才执行。函数的结构:
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从最外层看是字典,而字典的键值对可以是列表、字典、元组等等,由此可以获得多层嵌套的字典
- 在定义函数时,使用*args的形式,意味着可以接收任意多个额外的位置相关的参数到元组中;使用**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函数,lambda表达式,三目运算,列表解析,递归的更多相关文章
- python自动化测试之函数(匿名函数lambda和三目运算等(高级用法))
''' 匿名函数: lambda ''' def Add(a,b): print(a+b) Add(2,3) per = lambda a,b:a+b print(per(2,3)) ''' 三目运算 ...
- 第4.8节 三目运算、del和pass语句
一.三目运算 Python的三目运算与C语言的三目运算非常类似,具体语法如下: 条件为真的赋值表达式 if 条件 else 条件为假的表达式 三目运算实际上就是一种表达式计算,当对应if后面 ...
- Python【集合】、【函数】、【三目运算】、【lambda】、【文件操作】
set集合: •集合的创建; set_1 = set() #方法一 set_1 = {''} #方法二 •set是无序,不重复的集合; set_1 = {'k1','k2','k3'} set_1.a ...
- Python学习日记(五)——初识函数(set、深浅拷贝、三目运算、函数、全局变量和局部变量)
基本数据类型补充 set set集合,是一个无序且不重复的元素集合 #创建 s = {11,22,33,44}#类似字典 s = set() #转换 l = (11,22,33,44) s1 = se ...
- python运算符,数据类型,数据类型操作,三目运算,深浅拷贝
算数运算符: Py2中精确除法需要导入:from __future__ import division,(符由特 ,将来的.滴未省,除法) py3不需要导入 赋值运算符: 比较运算符: 成员运算符: ...
- python中实现三目运算
python中没有其他语言中的三元表达式,不过有类似的实现方法 如: a = 1 b =2 k = 3 if a>b else 4 上面的代码就是python中实现三目运算的一个小demo, 如 ...
- Python—三目运算
Python 可通过 if 语句来实现三目运算的功能,因此可以近似地把这种 if 语句当成三目运算符.作为三目运算符的 if 语句的语法格式如下: (True_statements) if (expr ...
- 【Python全栈笔记】03 [模块二] 16-17 Oct Set 集合,三目运算
Set 集合 set - unordered collections of unique elements 创建一个set/一个空set # create a new set set1 = {1,2, ...
- python 三目运算
python中的三目运算: result = a if condition else b #当满足condition返回a否则返回b 三目运算可以使你的代码看起来简洁,且运算高效
随机推荐
- 《C++primer》v5 第1章 开始 读书笔记 习题答案
从今天开始在博客里写C++primer的文字.主要以后面的习题作业为主,会有必要的知识点补充. 本人也是菜鸟,可能有不对之处,还望指出. 前期内容可能会比较水. 1.1略 1.2略 1.3 cin和c ...
- Android Sudoku第一版
经过几天的下班空闲时间写了一个android上的数独游戏,今天也申请了几个发布平台的账号,发布出去了,google play要收25刀,而且这个在大陆基本访问不上,所以暂时就没买.在移动平台写应用程序 ...
- 12-2 mysql 查询
老师提纲 1. create database test2. drop database test3. create table info( code int primary key, name va ...
- anjularjs 路由
在多视图单页面web应用中,angularjs使用路由‘#+标记’来区别不同的逻辑页面并将不同的页面绑定到对应的控制器上.通过一个简单的实例来深入理解: 1.index.html 主页面中插入代码: ...
- 修改LR自带的示例程序端口号
问题:LoadRunner的HP Web Tours 应用程序服务启动不了,提示1080端口被占用的问题 解决方法: 查看占用1080端口的进程 Cmd 窗口输入netstat –ano 找到占用该 ...
- oracle日期操作
日期操作:ADD_MONTHS(date,i) 作用 返回在自定日期上添加的月份 i是整数 如果i是小数,则截取整数部分 i是负数 原有日期减去相应部分 例子: SQL> select add_ ...
- mysql登陆出现unknown database错误可能原因
输入了错误命令如 # mysql -u root -p test 然后客户端会出现需要输入命令的提示,即使输入正确出现错误提示 正确命令是 # mysql -u root -p
- [转]Mysql命令行常用操作
Mysql命令行常用操作 一.从命令行登录MySQL数据库服务器 1.登录使用默认3306端口的MySQL /usr/local/mysql/bin/mysql -u root -p 2.通过TCP连 ...
- PyCharm 远程连接linux中Python 运行pyspark
PySpark in PyCharm on a remote server 1.确保remote端Python.spark安装正确 2.remote端安装.设置 vi /etc/profile添加一行 ...
- Python(文件、文件夹压缩处理模块,shelve持久化模块,xml处理模块、ConfigParser文档配置模块、hashlib加密模块,subprocess系统交互模块 log模块)
OS模块 提供对操作系统进行调用的接口 os.getcwd() 获取当前工作目录,即当前python脚本工作的目录路径 os.chdir("dirname") 改变当前脚本工作目 ...