Python函数及参数
## 函数
- 函数是代码的一种组织形式,一般一个函数完成一个特定功能
- 函数需要先定义后使用
- 函数的定义
def func_name(参数):
func_body
...
return func_result
## 函数的返回值
- 函数和过程的区别就在于有没有返回值
- 用return关键字表示返回内容
- 函数内在执行到return语句后,整个函数无条件结束执行
- 若在函数定义时没有明确的写明return内容,则该函数默认返回None
- 推荐无论函数有没有返回值都以return结束
## 函数的参数
- 位置参数(positional argument)
- 参数的值按照顺序依次传递
- 最常见,但是必须牢记每个位置参数的含义,若位置混淆,将会得到不可预测的结果
def self_intro(name, age, love):
return "Hello, I'm {0}, {1} years old, I love {2}".format(name, age, love) self_intro("Stanley", 22, "Python")
# "Hello, I'm Stanley, 22 years old, I love Python"
- 若参数位置错误,将会得到意外的结果
self_intro(22, "Stanley", "Python")
# "Hello, I'm 22, Stanley years old, I love Python"
- 关键字参数(keyword argument)
- 在函数调用时使用关键字,明确每个参数对应的值,以避免位置参数带来的混乱
self_intro(age=22, name="Stanley", love="Python")
# "Hello, I'm Stanley, 22 years old, I love Python"
- 也可以将位置参数和关键字参数结合使用,此时位置参数位置必须对应,关键字参数位置可以不对应
self_intro("Stanley", love="Python", age=22)
# "Hello, I'm Stanley, 22 years old, I love Python"
- 默认参数
- 无论是关键字参数还是位置参数,在函数调用时都必须提供参数值
- 对于不常用的参数或者多次函数调用使用相同值的参数就可以使用默认值参数,在函数调用时若未指定该参数的值,则该参数使用默认值,若指定了参数值则使用指定值
def self_intro(name, age, love="Python"):
return "Hello, I'm {0}, {1} years old, I love {2}".format(name, age, love) self_intro("Stanley", 22)
# "Hello, I'm Stanley, 22 years old, I love Python" self_intro("Stanley", 22, love="Lily")
# "Hello, I'm Stanley, 22 years old, I love Lily"
- 默认参数在函数被定义的时候就已经计算出来,而不是在程序运行的时候计算,所以在将可变的数据类型(比如列表或字典)当做默认参数时会出现一些问题
def demo(num, result=[]):
"""
将第一个参数添加到列表中,并返回一个单值列表
"""
result.append(num)
return result demo(1) # 函数第一次调用没有问题
# [1] demo(2) # 预期返回[2]
# [1, 2] # 实际返回
原因分析:默认参数在定义的时候就已经计算出来结果,之后的多次调用都只是针对原有列表进行操作,并没有生成新的列表,所以结果与预期有差异
修改:
def demo(num):
result = [] # 此时每次函数调用都生成一个新的列表
result.append(num)
return result demo(1)
# [] demo(2)
# [2] # 结果与预期相同
或:
def demo(num, result=None):
if result is None: # 若函数在调用时没有设置默认参数,则生成新的空列表
result = []
result.append(num)
return result demo(1)
# [] demo(2)
# [] demo(3, result=[1, 2])
# [1, 2, 3] demo(4)
# [4]
- 收集参数
- 收集参数有两种,分别使用*收集位置参数,使用**收集关键字参数
- 使用*收集位置参数
- 当参数被用在函数内部时,*将一组可变数量的位置参数收集添加到一个元组中
def get_args(*args):
return args get_args(1, 2, 3, "a", "b")
# (1, 2, 3, 'a', 'b')
- 位置参数和*收集参数同时使用,位置参数在获取值后,将其余位置参数全部放入*收集参数中
def self_intro(name, age, *loves):
return "Hello, I'm {0}, {1} years old. I love {2}".format(name, age, loves) self_intro("Stanley", 22, "Python", "JS", "HTML", "CSS")
# "Hello, I'm Stanley, 22 years old. I love ('Python', 'JS', 'HTML', 'CSS')"
- 使用**收集关键字参数
- 使用**可以将参数收集到一个字典中,参数的名称是字典的键,对应的参数值是字典的值
def self_intro(**kwargs):
return kwargs self_intro(name="Stanley", age=22, love="Python")
# {'name': 'Stanley', 'age': 22, 'love': 'Python'}
- 几种参数的混合使用
def self_intro(name, age, *args, love="Python", **kwargs):
print("My name is {0}, I'm {1} years old".format(name, age))
for arg in args:
print("I'm {}".format(arg))
print("My love is {0}".format(love))
for k, v in kwargs.items():
print("My {0} is {1}".format(k, v)) self_intro("Stanley", 22, "male", "Student", nationality="China", major="English")
# My name is Stanley, I'm 22 years old
# I'm male
# I'm Student
# My love is Python
# My nationality is China
# My major is English
## 函数递归
- 函数自己调用自己
- 优点:简洁,容易理解
- 缺点:对递归深度有限制,消耗资源大
- 写递归时一定注意结束条件,递归次数不要超过python系统限制
- fibnacci数列
def fib(n):
lis = []
for i in range(n):
if i == 0 or i == 1:
lis.append(1)
else:
lis.append(lis[i - 1] + lis[i - 2])
return lis def f(n):
if n == 1 or n == 2:
return 1
return f(n - 1) + f(n - 2) print(f(10)) # -> 55
print(fib(10)) # -> [1, 1, 2, 3, 5, 8, 13, 21, 34, 55]
## 函数文档
- 函数的文档的作用是对当前函数提供使用相关的参考信息
- 文档的写法
- 在函数内部开始的第一行使用三双引号字符串定义符
- 一般具有特定格式
- 文档查看
- 使用help(func_name)
- 使用func_name.__doc__
本文参考书籍:[美]Bill Lubanovic 《Python语言及其应用》
Python函数及参数的更多相关文章
- Python函数可变参数*args及**kwargs详解
初学Python的同学们看到代码中类似func(*args, **kwargs)这样的函数参数定义时,经常感到一头雾水. 下面通过一个简单的例子来详细解释下Python函数可变参数*args及**kw ...
- 【转】Python函数默认参数陷阱
[转]Python函数默认参数陷阱 阅读目录 可变对象与不可变对象 函数默认参数陷阱 默认参数原理 避免 修饰器方法 扩展 参考 请看如下一段程序: def extend_list(v, li=[]) ...
- 详解python函数的参数
详解python函数的参数 一.参数的定义 1.函数的参数在哪里定义 在python中定义函数的时候,函数名后面的括号里就是用来定义参数的,如果有多个参数的话,那么参数之间直接用逗号, 隔开 案列: ...
- 可变数据类型不能作为python函数的参数
可变数据类型:列表.字典 不可变数据类型:整型.浮点型.字符串.元组 为什么可变数据类型不能作为python函数的参数?请看以下例子: def foo(a=[]): a.append(1) retur ...
- python 函数传递参数的多种方法
python中函数根据是否有返回值可以分为四种:无参数无返回值,无参数有返回值,有参数无返回值,有参数有返回值. Python中函数传递参数的形式主要有以下五种,分别为位置传递,关键字传递,默认值传递 ...
- python函数动态参数详解
Python的动态参数: 1,参数前一个"*":在函数中会把传的参数转成一个元组. def func (*args): print(args) func(123,1,2,'a') ...
- Python 函数的参数知识汇总
函数搞不熟,后边就晕头转向了,在此重新归纳一下廖大神的函数教程,加深记忆 一.函数的参数分为: 位置参数 def power(x): # x 就是power(x)的一个位置参数,我们调用power(x ...
- Python学习笔记(四)Python函数的参数
Python的函数除了正常使用的必选参数外,还可以使用默认参数.可变参数和关键字参数. 默认参数 基本使用 默认参数就是可以给特定的参数设置一个默认值,调用函数时,有默认值得参数可以不进行赋值,如: ...
- 使用可变对象作为python函数默认参数引发的问题
写python的都知道,python函数或者方法可以使用默认参数,比如 1 def foo(arg=None): 2 print(arg) 3 4 foo() 5 6 foo("hello ...
- Python面试题目之Python函数默认参数陷阱
请看如下一段程序: def extend_list(v, li=[]): li.append(v) return li list1 = extend_list(10) list2 = extend_l ...
随机推荐
- 让你分分钟学会 javascript 闭包
闭包,是 javascript 中重要的一个概念,对于初学者来讲,闭包是一个特别抽象的概念,特别是ECMA规范给的定义,如果没有实战经验,你很难从定义去理解它.因此,本文不会对闭包的概念进行大篇幅描述 ...
- SQL DATEDIFF语法及时间函数 Sql 查询当天、本周、本月记录
SQL DATEDIFF语法及时间函数 Sql 查询当天.本周.本月记录 转:http://blog.csdn.net/Json1204/article/details/7863801?locatio ...
- avalon教程-简介
avalon是什么? avalon是一个MVVM框架, Modle-模型层,即为js中从后台接口中取出的数据,例如一个对象或者对象数组,并对这些数据进行一定的格式化.常见的返回数据是这样的{id : ...
- mysql-增删改(DML)
插入:insert /*方式一:经典的插入 insert into 表名(列名,...) values(值1,...); */ #.插入的值的类型要与列的类型一致或兼容 INSERT INTO bea ...
- WebView加载页面,带链接的Img在页面第一次加载时无法显示的问题
在做一个App的过程中,用到WebView来显示几个页面.在这个过程中发现有些页面的显示出现了异常:页面中的Img链接在页面第一次加载时无法正常显示图片,退出页面再次进入后可正常显示.开始以为是Web ...
- 使用跨平台图表控件TeeChart如何从DAT或TEXT文件中导入数据
大多数开发人员在使用TeeChart进行开发的时候,都需要访问包含在文本文档中的一些数据,本次教程将详细讲解如何去实现这一步骤. 文本文件通常包含使用空格键或者是TAB键分隔开的数字和文字: TeeC ...
- view 状态动画
stateListAnimator 一.xml配置 方法 res/xml/animate_scale.xml <?xml version="1.0" encoding=&qu ...
- centos部署vue项目
参考链接 nodejs服务器部署教程二,把vue项目部署到线上 打包 #在本地使用以下命令,打包 npm run build #打包之后本地会出现dist文件夹.将dist文件夹以及package.j ...
- 4 - 函数&装饰器 and 迭代器&生成器
函数是什么 函数一词来源于数学,但编程中的「函数」概念,与数学中的函数是有很大不同的.程序里函数的定义是: 定义:将一组语句的集合通过一个名字(函数名)封装起来,要想执行这个函数,只需调用其函数名即可 ...
- C++学习之继承中的成员访问控制
由基类到派生类的过程中,在派生类里如何访问基类成员,以及派生类对象如何访问基类成员,是根据派生类在从基类派生时是以什么方式进行的派生:public.protect或者private.下面说一下在这三种 ...