您的位置:首页 > 编程语言 > Python开发

python函数基础

2016-10-16 18:04 357 查看

一、基础

函数的定义

def 函数名(参数):
...
函数体
...
返回值        #如果函数执行完毕也没有return语句时,自动return None。

空函数

如果想定义一个什么事也不做的空函数,可以用pass语句:

def nop():
pass()         #pass语句什么都不做,用来作为占位符。

参数检查

调用函数时,如果参数个数不对,Python解释器会自动检查出来,并抛出TypeError;如果参数类型不对,Python解释器无法检查,可通过内置函数isinstance()来实现。

li = []
ret = isinstance(li,list)
print(ret)    #True

返回值

在python中根据返回对象的个数不同,返回结果的数据类型也不同

返回对象的个数返回类型
0NoneType
1取决于返回对象的数据类型
>1tuple
def f1():
return

def f2():
return True

def f3():
return 1,2,3

print(type(f1()))   #<class 'NoneType'>
print(type(f2()))   #<class 'bool'>
print(type(f3()))   #<class 'tuple'>

二、参数

普通参数

# ######### 定义函数 ######### # name 叫做函数func的形式参数,简称:形参def func(name):
print name

# ######### 执行函数 #########
# 'morra' 叫做函数func的实际参数,简称:实参
func('morra')

指定形参传入实参

def func(p, text, subject):
ret = p + text + subject
return ret

print(func(subject="XXX", p="123", text="OK"))    ##使用该方法后不需要按顺序传入实参

默认参数

默认参数可以简化函数的调用,但是需要放在参数列表最后,并且必须指向不变对象。

def func(name, age = 18):        #
print "%s:%s" %(name,age)

func('morra', 19)    # 指定参数
func('hello')        # 使用默认参数

动态参数一(可变参数)

def func(*args):        #在形参前加*之后args变成动态参数,该参数的数据类型变成了tuple元组
print(type(args))    #<class 'tuple'>
print(args)

# 执行方式一
func(11,33,4,4454,5)    #可传入数字、字符串、列表、元组等等

# 执行方式二
#这里需要注意一下,如果写func(*li) ,则表示把list转换为tuple再传入实参;如果写的是func(li)那么就表示把list当做tuple的元素()传入实参。
li = [11,2,2,3,3,4,54]
func(*li)

动态参数二(关键字参数)

def func(**args):        #在形参前加**之后,该参数的数据类型变成了dict字典
print(type(args))    #<class 'dict'>print args
print(args)

# 执行方式一
func(name='morra',age=18)

# 执行方式二
li = {'name':'morra', age:18, 'gender':'male'}
func(**li)

命名关键字参数

用来限制传入关键字参数的名字

def person(name, age, *, city, job):    #*不是参数,而是特殊分隔符
print(name, age, city, job)

person('morra', 18, city='beijing', job='engineer')

OUTPUT:
morra 18 beijing engineer

命名关键字参数必须传入参数名,否则会报错:

def person(name, age, *, city, job):
print(name, age, city, job)

person('morra', 18, 'beijing', 'engineer')

OUTPUT:
Traceback (most recent call last):
File "C:/test.py", line 6, in <module>
person('morra', 18, 'beijing', 'engineer')
TypeError: person() takes 2 positional arguments but 4 were given

动态参数三(万能参数)

def func(*args, **kwargs):
print args
print kwargs

*参数定义的顺序

必选参数 > 默认参数 > 可变参数/命名关键字参数 > 关键字参数

三、补充

三目运算:

学习条件运算时,对于简单的 if else 语句,可以使用三元运算来表示,即:

# ###################### 普通条件语句 ######################

if 1==1 :
name = "hello"
else:
name = "world"
# ###################### 三目运算 ######################
name = "hello" if 1==1 else "world"
print(name)

lambda表达式

对于简单的函数,也存在一种简便的表示方式,即:lambda表达式

# ###################### 普通函数 ######################
# 定义函数(普通方式)
def func(arg):
return arg + 1

# 执行函数
result = func(123)

# ###################### lambda ######################

# 定义函数(lambda表达式)
my_lambda = lambda arg : arg + 1

# 执行函数
result = my_lambda(123)

四、递归

py标准的解释器没有针对尾递归做优化,因此任何递归函数都存在栈溢出的问题。

练习

# 利用递归函数计算阶乘
# N! = 1 * 2 * 3 * ... * N
def fact(n):
if n == 1:
return 1
return n * fact(n-1)

print('fact(1) =', fact(1))
print('fact(5) =', fact(5))
print('fact(10) =', fact(10))

# 利用递归函数移动汉诺塔:
def move(n, a, b, c):
if n == 1:
print('move', a, '-->', c)
return
move(n-1, a, c, b)
print('move', a, '-->', c)
move(n-1, b, a, c)

move(4, 'A', 'B', 'C')

# 斐波那契数列
def func(a, b):
if a == 0:
print(a, b)
c = a + b
print(c)
func(b, c)

func(0, 1)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: