## **函数(1)**
**函数的定义:**
1. [ ] 小时候大家应该都玩过乐高积木,只要通过想象和创意,可以用它怕拼凑出很多神奇的东西。随着学习的深入,编写的代码日益增加并且越来越复杂,所以需要找一个方法对这些复杂的代码进行重新组织。
2. [ ] 为了是使得程序的代码更为简单,就需要把程序分解成较小的组成部分。(三种方法 函数,对象和模块)
3. [ ] 函数就是把代码打包成了不同形状的乐高积木。之前接触的BIF(内置函数)就是python帮我们封装好的函数,用的时候很方便。简单来讲,一个程序可以按照不同功能的实现,分割许多代码块,每一个代码块就可以封装成一个函数。在python中创建一个函数用def关键字:
函数 模板
> def 函数名称():
> 函数内容
例如
```
def MyFirstFunction() :
print("这是我创建的第一个函数")
print("我很开心")
```
注意,在函数名后面要加上一对小括号。
- [ ] 函数的调用:(既然创建了函数就要去使用)
```
>>>def MyFirstFunction() :
print("这是我创建的第一个函数")
print("我很开心")
>>>MyFirstFunction()
```
- [ ] 并且函数的调用还可以有返回值,例如
```
>>>def MyFirstFunction() :
return '函数调用成功'
>>>str_list = MyFirstFunction()
>>>print(str_list) #'函数调用成功'
```
在你定义的函数下面输入函数的名称就可以进行调用。(函数的调用机制:当函数MyFirstFunction() 发生调用操作的时候,python会自动往上找到 def MyFirstFunction() 的定义过程,然后依次执行该函数所包含的代码块部分)
> 总结:
> 1.遇到return,此函数结束,return后面的东西将不会在执行
2.return 返回值
关于返回值:
如果return什么都不写或者干脆就没写return,返回的结果就是None
如果return后面写了一个值,返回给调用者这个值
如果return后面写了多个结果,,返回给调用者一个tuple(元祖),调用者可以直接使用解构获取多个变量
**函数的参数**
- [ ] 为什么说函数名的后面一定要跟括号呢?因为括号里面还要放很重要的东西——参数。(在参数刚开始被发明出来的时候,是没有参数,很快就引出来许多小伙伴们的质疑:函数不过是对做同样内容的代码进行打包,这样跟使用循环就没有什么本质上的区别了。所以为了使每次调用的函数可以有不同的实现,加入了参数的概念)
例如
```
>>>def MyFirstFunction(name):
print(name + '是帅哥')
####################
>>>def MyFIrstFunction('张三')##张三是帅哥
```
- [ ] 刚刚的例子只有一个函数,当然也可以使用多个函数,使用多个参数,只需要用逗号隔开即可。
```
>>>def add_sum(num1,num2)
return(num1+num2)
########################
>>>res = add_sum(1,2)
>>>print(res) ## 3
```
- [ ] 参数:参数从调用的角度来说,分为形式参数和实际参数。跟绝大多数编程语言一样,形参指的是函数创建和定义过程中小括号里的参数,而实参指的是函数在被调用的过程中传递进来的参数。
例如。(还有一个传参:给函数传递信息的时候将实际参数交给形式参数的过程被称为传参.)
```
>>> def Function(name)
print(name)
>>>Function('张三')
##
张三
```
- [ ] 关键字参数:普通的参数叫做位置参数,通常在调用一个函数的时候,粗心的程序员会将容易搞乱位置参数的顺序,已致函数的调用无法达到预期的效果,因此为了准确的传递参数,便有了关键词参数。
```
def yue(chat, address, age):
print("拿出手机")
print("打开"+chat)
print("找个"+address+"附近漂亮的"+str(age)+"岁妹子")
yue(chat="微信", age=18, address="北京") # 关键字参数.
结果:
拿出手机
打开微信
找个北京附近漂亮的18岁妹子
```
> **总结**
> 1.位置参数
2.关键字参数
3.混合参数, 位置参数必须在关键字参数前面
- [ ] 默认参数:在函数声明的时候, 就可以给出函数参数的默认值. 在调用的时候可以 给出具体的值, 也可以不给值,
```
def stu_info(name, age, sex='男'):
print("录入学生信息")
print(name, age, sex)
print("录入完毕")
stu_info("张强", 18)
##############
录入学生信息
'张强',18,'男'
录入完毕
```
当然如果输入 (’张强‘,18,女)就可以将男覆盖掉
> 综上:
> 在形参的角度来看
> 位置参数
> 默认值参数(大多数传进来的参数都是一样的, 一般用默认参数
- [ ] 动态参数(可变参数/收集参数):发明这种参数的目的是函数的作者有时候也不知道这个函数需要多少个参数。。。。。
```
def eat(a,b,c):
print('我想吃%s%s%s'%(a,b,c))
eat('米饭','面条','饺子')
############################# 等价
def eat(*args):
print('我想吃',args)
eat('大米饭','中米饭','小米饭') # 收到的结果是一个tuple元祖
( 注意点:*号的变量会把所有的元素都存进元组中)
#################
def eat(*args,a,b):
print('我想吃',args,a,b)
eat('大米饭','中米饭','小米饭')
结果:
TypeError: eat() missing 2 required keyword-only arguments: 'a' and 'b'
# eat函数在调用的时候发现缺少俩个位置参数没有进行传递
```
- [ ] 动态接收关键字参数:在python中可以动态的位置参数,但是这种情况只能接收位置参数无法接收关键字参数,在python中使用*来接收动态关键字参数
```
def func(**kwargs):
print(kwargs)
func(a=1, b=2, c=3)
结果:
{'a': 1, 'b': 2, 'c': 3}
```
> 动态关键字参数最后获取的是一个dict字典形式
顺序的问题, 在函数调用的时候, 如果先给出关键字参数, 则整个参数列表会报错.
```
def func(a,b,c,d):
print(a,b,c,d)
func(1,2,c=3,4)
结果:
File "D:/python_object/path2/test.py", line 806
func(1,2,c=3,4) ^
SyntaxError: positional argument follows keyword argument
```
> 关键参数必须要放在位置参数后边,由于实参是这个顺序,所以形参接收的时候也是这个顺序.也就是说位置参数必须在关键字参数前面.动态接收关键字参数也要在后面
>
> 最终顺序:
>
> 位置参数 > args(动态位置参数) > 默认值参数 > *kwargs(动态默认参数)
>
> 这四种参数可以任意的使用
- [ ] 函数的文档(函数的注释):
```
def exchangRate(dollar):
"""
美元--->人民币
汇率暂定为6.5 (对函数的注释)
"""
return dollar * 6.5
```
**函数的作用域**
- [ ] 作用域就是作用范围, 按照生效范围来看分为 全局作用域 和 局部作用域
全局作用域: 包含内置命名空间和全局命名空间. 在整个文件的任何位置都可以使用(遵循 从上到下逐⾏执行).
局部作用域: 在函数内部可以使用.
- [ ] 变量的作用域也就是所说的变量可见性。
```
def fun():
a = 10
print(a)
fun()
print(a) # a不存在了已经..
```
- [ ] 我们可以通过globals()函数来查看全局作⽤用域中的内容,也可以通过locals()来查看局部作 ⽤用域中的变量量和函数信息
```
a = 10
def func():
a = 40
b = 20
print("哈哈")
print(a, b)
print(globals()) # 打印全局作用域中的内容
print(locals()) # 打印局部作用域中的内容
func()
```
**以上就是函数的第一部分内容,感谢点击观看,欢迎评论**