Python初识函数

初识函数

函数的概念

wiki百科中解释:函数是一个大型程序中的某部分代码,由一个或多个语句块组成。它负责完成某项特定任务,而且相较于其他代码,具备相对的独立性。一般会有输入参数并有返回值,提供对过程的封装和细节的隐藏。
简而言之,函数就是具有输入参数、输出参数的,并且可以独立完成特定功能的程序代码。

函数与方法的区别

函数

  • 通过函数名()的方式调用

方法

  • 通过类的实例.方法名()的方式调用

判断函数or方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#!/usr/bin/python
from types import FunctionType, MethodType

class Foo(object):
def __init__(self):
pass
def func(self):
print(self,"in func")

foo = Foo() # foo是类Foo的实例
foo.func() # 类Foo的实例调用func
Foo.func(foo) # 类Foo调用func,并传入foo实例

print(isinstance(foo.func, FunctionType)) # False
print(isinstance(foo.func, MethodType)) # True #说明这是一个方法

print(isinstance(Foo.func, FunctionType)) # True #说明这是一个函数。
print(isinstance(Foo.func, MethodType)) # False

命名空间

wiki百科中的解释:它表示着一个标识符的可见范围。
简而言之,命名空间就是对象或变量的作用范围。
python中的命名空间:内置命名空间、全局命名空间、局部命名空间

  • 内置命名空间: python编译器启动时就可以使用的名字存在内置命名空间中
  • 全局命名空间: 除函数外的代码部分
  • 局部命名空间: 函数内部的代码部分

作用域

wiki百科中解释:作用域是名字(name)与实体(entity)的绑定保持有效的那部分计算机程序。
简而言之,作用域就是变量有效的代码区域。
python中的作用域分为:全局变量作用域、局部变量作用域

  • 全局变量作用域:是整个代码范围。
  • 局部变量作用域:是定义该变量的子程序的代码范围。
  • 同名变量在全局和局部变量作用域如何划分:在局部变量作用域代码范围内,局部变量起作用;在其他地方全局变量起作用。

参数

参数的概念

参数可以理解为函数的输入值。

参数的种类

  • 形参的角度(函数定义阶段)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# 位置参数:必须传,且有多少就必须传多少
def name_sex(name, sex):
print('姓名是:' + name + '\n性别是:' + sex)
name_sex('张三','男')
>>> 姓名是:张三
>>> 性别是:男

# 默认参数:可传可不传,不传则使用默认值
def name_sex(name, sex='男'):
print('姓名是:' + name + '\n性别是:' + sex)
name_sex('张三')
>>> 姓名是:张三
>>> 性别是:男

# *args:接收的是按照位置传参的值,组织成一个元组
def name_sex(*args):
print(args)
name_sex('张三','男')
>>>('张三', '男')

# **kwargs:接受的是按照关键字传参的值,组织成一个字典
def name_sex(**kwargs):
print(kwargs)
name_sex(姓名='张三',性别='男')
>>> {'性别': '男', '姓名': '张三'}
  • 实参的角度(函数调用阶段)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 按位置传参
def name_sex(name, sex):
print('姓名是:' + name + '\n性别是:' + sex)
name_sex('张三', '男')
>>>姓名是:张三
>>>性别是:男

# *按关键字传参
def name_sex(name, sex):
print('姓名是:' + name + '\n性别是:' + sex)
name_sex(sex='男',name='张三')
>>>姓名是:张三
>>>性别是:男

# *按位置、按关键字混合传参:必须按照位置参数,再按照关键字传参,不能将参数赋予多个值
def name_sex(name, sex):
print('姓名是:' + name + '\n性别是:' + sex)
name_sex('张三',sex='男')
>>>姓名是:张三
>>>性别是:男

多种参数混合的顺序

  • 位置参数 -> *args -> 默认参数 -> **kwargs

动态参数的另一个传参方式

  • 站在形参的角度上,给变量加上*,就是组合所有传来的值。
  • 站在实参的角度上,给一个序列加上*,就是将这个序列按照顺序打散

默认参数的陷阱

  • 默认参数是可变数据类型
1
2
3
4
5
6
7
8
#!/usr/bin/python

def foo(arg,lst = []):
lst.append(arg)
print(lst)

foo('python')
foo('java')

返回值

返回值的概念

返回值可以理解为函数的输出值。

返回值的种类

  • 没有返回值,默认返回None
    • 只有return:结束一个函数的继续
    • 没有return
    • return None:不常用
  • 一个返回值
    • 可以返回任何数据类型
    • 只要返回就可以接收到
    • 如果在一个函数中有多个return,只返回第一个
  • 多个返回值
    • 用多个变量接收:有多少返回值就要有多少变量接收
    • 用一个变量接收:接收到的是一个元组