函数、复合语句
This commit is contained in:
parent
813f6a1c53
commit
fc472a1e68
140
docs/开发/Python/函数.md
Normal file
140
docs/开发/Python/函数.md
Normal file
@ -0,0 +1,140 @@
|
|||||||
|
---
|
||||||
|
id: 函数定义
|
||||||
|
title: 函数定义
|
||||||
|
sidebar_position: 2.5
|
||||||
|
data: 2022年2月10日
|
||||||
|
---
|
||||||
|
|
||||||
|
通过白盒/黑盒封装多行代码的实现,一般情况下拥有输入和输出,用来**简化代码**、**重复调用**和**模块化编程**。
|
||||||
|
|
||||||
|
在 Python 中可以使用`def`关键字来定义函数,和变量一样每个函数也有一个响亮的名字,而且命名规则跟变量的命名规则是一致的。函数内的第一条语句是字符串时,该字符串就是**文档字符串**,也称为 docstring。
|
||||||
|
|
||||||
|
```python
|
||||||
|
def fib(n):
|
||||||
|
"""输出限定数值内的斐波那契数列函数"""
|
||||||
|
a, b = 0, 1
|
||||||
|
while a < n:
|
||||||
|
print(a, end=' ')
|
||||||
|
a, b = b, a+b
|
||||||
|
print()
|
||||||
|
```
|
||||||
|
|
||||||
|
### 默认值参数
|
||||||
|
|
||||||
|
在 Python 中,函数的参数可以有默认值,也支持使用可变参数,所以 Python 并不需要像其他语言一样支持函数的重载,因为我们在定义一个函数的时候可以让它有多种不同的使用方式。
|
||||||
|
|
||||||
|
```python
|
||||||
|
def add(a=0, b=0, c=0):
|
||||||
|
"""三个数相加"""
|
||||||
|
return a + b + c
|
||||||
|
add(1,2)
|
||||||
|
# 3
|
||||||
|
```
|
||||||
|
|
||||||
|
### 键值参数
|
||||||
|
|
||||||
|
`kwarg=value` 形式的 关键字参数 也可以用于调用函数。函数示例如下:
|
||||||
|
|
||||||
|
该函数接受一个必选参数(`voltage`)和三个可选参数(`state`, `action` 和 `type`)。
|
||||||
|
|
||||||
|
```python
|
||||||
|
def parrot(voltage, state='a stiff', action='voom', type='Norwegian Blue'):
|
||||||
|
print("-- This parrot wouldn't", action, end=' ')
|
||||||
|
print("if you put", voltage, "volts through it.")
|
||||||
|
print("-- Lovely plumage, the", type)
|
||||||
|
print("-- It's", state, "!")
|
||||||
|
|
||||||
|
parrot("halo",type="test")
|
||||||
|
|
||||||
|
# -- This parrot wouldn't voom if you put halo volts through it.
|
||||||
|
# -- Lovely plumage, the test
|
||||||
|
# -- It's a stiff !
|
||||||
|
```
|
||||||
|
|
||||||
|
### 特殊参数
|
||||||
|
|
||||||
|
#### 可变参数 *
|
||||||
|
|
||||||
|
在参数名前面的 * 表示 args 是一个可变参数,可以输入多个参数。
|
||||||
|
|
||||||
|
```python
|
||||||
|
def add2(*args):
|
||||||
|
total = 0
|
||||||
|
for val in args:
|
||||||
|
total += val
|
||||||
|
print(total)
|
||||||
|
|
||||||
|
add2(1,2,3)
|
||||||
|
# 6
|
||||||
|
```
|
||||||
|
|
||||||
|
#### 键值参数 **
|
||||||
|
|
||||||
|
在参数名前面的 ** 表示 args 是一个可变参数,可以输入键值对。
|
||||||
|
|
||||||
|
```python
|
||||||
|
def add2(**arg):
|
||||||
|
print(arg)
|
||||||
|
|
||||||
|
add2(name="halo")
|
||||||
|
# {'name': 'halo'}
|
||||||
|
```
|
||||||
|
|
||||||
|
#### 限位置参数 /
|
||||||
|
|
||||||
|
`/`必须放在形参后面表示限制位置参数,实参必须按照形参位置输入。
|
||||||
|
|
||||||
|
```python
|
||||||
|
def pos_only_arg(arg, /):
|
||||||
|
print(arg)
|
||||||
|
```
|
||||||
|
|
||||||
|
#### 限关键字参数 *
|
||||||
|
|
||||||
|
`*`必须放在形参前面表示限关键字参数,实参必须按键值参数输入。
|
||||||
|
|
||||||
|
```python
|
||||||
|
def kwd_only_arg(*, arg):
|
||||||
|
print(arg)
|
||||||
|
```
|
||||||
|
|
||||||
|
特殊参数组合
|
||||||
|
|
||||||
|
```python
|
||||||
|
def combined_example(pos_only, /, standard, *, kwd_only):
|
||||||
|
print(pos_only, standard, kwd_only)
|
||||||
|
|
||||||
|
"""
|
||||||
|
运行示例
|
||||||
|
"""
|
||||||
|
>>> combined_example(1, 2, 3)
|
||||||
|
Traceback (most recent call last):
|
||||||
|
File "<stdin>", line 1, in <module>
|
||||||
|
TypeError: combined_example() takes 2 positional arguments but 3 were given
|
||||||
|
|
||||||
|
>>> combined_example(1, 2, kwd_only=3)
|
||||||
|
1 2 3
|
||||||
|
|
||||||
|
>>> combined_example(1, standard=2, kwd_only=3)
|
||||||
|
1 2 3
|
||||||
|
|
||||||
|
>>> combined_example(pos_only=1, standard=2, kwd_only=3)
|
||||||
|
Traceback (most recent call last):
|
||||||
|
File "<stdin>", line 1, in <module>
|
||||||
|
TypeError: combined_example() got some positional-only arguments passed as keyword arguments: 'pos_only'
|
||||||
|
```
|
||||||
|
|
||||||
|
### Lambda 表达式
|
||||||
|
|
||||||
|
lambda 关键字用于创建小巧的匿名函数。lambda a, b: a+b 函数返回两个参数的和。Lambda 函数可用于任何需要函数对象的地方。在语法上,匿名函数只能是单个表达式。在语义上,它只是常规函数定义的语法糖。与嵌套函数定义一样,lambda 函数可以引用包含作用域中的变量:
|
||||||
|
|
||||||
|
```python
|
||||||
|
>>> def make_incrementor(n):
|
||||||
|
... return lambda x: x + n
|
||||||
|
...
|
||||||
|
>>> f = make_incrementor(42)
|
||||||
|
>>> f(0)
|
||||||
|
42
|
||||||
|
>>> f(1)
|
||||||
|
43
|
||||||
|
```
|
@ -1,11 +1,11 @@
|
|||||||
---
|
---
|
||||||
id: 流程控制语句
|
id: 复合语句
|
||||||
title: 流程控制语句
|
title: 复合语句
|
||||||
sidebar_position: 2
|
sidebar_position: 2
|
||||||
data: 2022年2月9日
|
data: 2022年2月9日
|
||||||
---
|
---
|
||||||
|
|
||||||
## 判断语句
|
## 判断
|
||||||
|
|
||||||
### if
|
### if
|
||||||
|
|
||||||
@ -58,7 +58,7 @@ case 401 | 403 | 404:
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
## 循环语句
|
## 循环
|
||||||
|
|
||||||
### for
|
### for
|
||||||
|
|
||||||
@ -149,7 +149,7 @@ for n in range(2, 10):
|
|||||||
"""
|
"""
|
||||||
```
|
```
|
||||||
|
|
||||||
## 其他语句
|
## 其他
|
||||||
|
|
||||||
### pass
|
### pass
|
||||||
|
|
@ -1,124 +1,12 @@
|
|||||||
---
|
---
|
||||||
id: 函数、字符串和常用数据结构
|
id: 数据结构
|
||||||
title: 函数、字符串和常用数据结构
|
title: 数据结构
|
||||||
sidebar_position: 3
|
sidebar_position: 3
|
||||||
data: 2022年1月27日
|
data: 2022年1月27日
|
||||||
---
|
---
|
||||||
|
|
||||||
## 函数
|
|
||||||
|
|
||||||
通过白盒/黑盒封装多行代码的实现,一般情况下拥有输入和输出,用来**简化代码**、**重复调用**和**模块化编程**。
|
## 字符串
|
||||||
|
|
||||||
### 函数定义
|
|
||||||
|
|
||||||
在 Python 中可以使用`def`关键字来定义函数,和变量一样每个函数也有一个响亮的名字,而且命名规则跟变量的命名规则是一致的。在函数名后面的圆括号中可以放置传递给函数的参数,这一点和数学上的函数非常相似,程序中函数的参数就相当于是数学上说的函数的自变量,而函数执行完成后我们可以通过`return`关键字来返回一个值,这相当于数学上说的函数的因变量。
|
|
||||||
|
|
||||||
### 函数的参数
|
|
||||||
|
|
||||||
在 Python 中,函数的参数可以有默认值,也支持使用可变参数,所以 Python 并不需要像其他语言一样支持[函数的重载](https://zh.wikipedia.org/wiki/函数重载),因为我们在定义一个函数的时候可以让它有多种不同的使用方式。
|
|
||||||
|
|
||||||
```python
|
|
||||||
from random import randint
|
|
||||||
|
|
||||||
|
|
||||||
def roll_dice(n=2):
|
|
||||||
"""摇色子"""
|
|
||||||
total = 0
|
|
||||||
for _ in range(n):
|
|
||||||
total += randint(1, 6)
|
|
||||||
return total
|
|
||||||
|
|
||||||
|
|
||||||
def add(a=0, b=0, c=0):
|
|
||||||
"""三个数相加"""
|
|
||||||
return a + b + c
|
|
||||||
|
|
||||||
# 在参数名前面的*表示args是一个可变参数
|
|
||||||
def add2(*args):
|
|
||||||
total = 0
|
|
||||||
for val in args:
|
|
||||||
total += val
|
|
||||||
return total
|
|
||||||
|
|
||||||
|
|
||||||
# 如果没有指定参数那么使用默认值摇两颗色子
|
|
||||||
print(roll_dice())
|
|
||||||
# 摇三颗色子
|
|
||||||
print(roll_dice(3))
|
|
||||||
print(add())
|
|
||||||
print(add(1))
|
|
||||||
print(add(1, 2))
|
|
||||||
print(add(1, 2, 3))
|
|
||||||
# 传递参数时可以不按照设定的顺序进行传递
|
|
||||||
print(add(c=50, a=100, b=200))
|
|
||||||
|
|
||||||
# 在调用add函数时可以传入0个或多个参数
|
|
||||||
print(add2())
|
|
||||||
print(add2(1))
|
|
||||||
print(add2(1, 2))
|
|
||||||
print(add2(1, 2, 3))
|
|
||||||
print(add2(1, 3, 5, 7, 9))
|
|
||||||
```
|
|
||||||
|
|
||||||
### 用模块管理函数
|
|
||||||
|
|
||||||
由于 Python 没有函数重载的概念,那么后面的定义会覆盖之前的定义,也就意味着两个函数同名函数实际上只有一个是存在的。
|
|
||||||
|
|
||||||
```python
|
|
||||||
def foo():
|
|
||||||
print('hello, world!')
|
|
||||||
|
|
||||||
def foo():
|
|
||||||
print('goodbye, world!')
|
|
||||||
|
|
||||||
下面的代码会输出什么呢?
|
|
||||||
|
|
||||||
foo()
|
|
||||||
```
|
|
||||||
|
|
||||||
Python中每个文件就代表了一个模块(module),我们在不同的模块中可以有同名的函数,在使用函数的时候我们通过`import`关键字导入指定的模块就可以区分到底要使用的是哪个模块中的`foo`函数,代码如下所示。
|
|
||||||
|
|
||||||
`module1.py`
|
|
||||||
|
|
||||||
```python
|
|
||||||
def foo():
|
|
||||||
print('hello, world!')
|
|
||||||
```
|
|
||||||
|
|
||||||
`module2.py`
|
|
||||||
|
|
||||||
```python
|
|
||||||
def foo():
|
|
||||||
print('goodbye, world!')
|
|
||||||
```
|
|
||||||
|
|
||||||
`test.py`
|
|
||||||
|
|
||||||
```python
|
|
||||||
from module1 import foo
|
|
||||||
|
|
||||||
# 输出hello, world!
|
|
||||||
foo()
|
|
||||||
|
|
||||||
from module2 import foo
|
|
||||||
|
|
||||||
# 输出goodbye, world!
|
|
||||||
foo()
|
|
||||||
```
|
|
||||||
|
|
||||||
也可以按照如下所示的方式来区分到底要使用哪一个`foo`函数。
|
|
||||||
|
|
||||||
```python
|
|
||||||
import module1 as m1
|
|
||||||
import module2 as m2
|
|
||||||
|
|
||||||
m1.foo()
|
|
||||||
m2.foo()
|
|
||||||
```
|
|
||||||
|
|
||||||
## 字符串和常用数据结构
|
|
||||||
|
|
||||||
### 字符串
|
|
||||||
|
|
||||||
所谓**字符串**,就是由零个或多个字符组成的有限序列。在Python程序中,如果我们把单个或多个字符用单引号或者双引号包围起来,就可以表示一个字符串。
|
所谓**字符串**,就是由零个或多个字符组成的有限序列。在Python程序中,如果我们把单个或多个字符用单引号或者双引号包围起来,就可以表示一个字符串。
|
||||||
|
|
@ -1,6 +1,6 @@
|
|||||||
---
|
---
|
||||||
id: 面对对象编程
|
id: 面对对象
|
||||||
title: 面对对象编程
|
title: 面对对象
|
||||||
sidebar_position: 4
|
sidebar_position: 4
|
||||||
data: 2022年1月28日
|
data: 2022年1月28日
|
||||||
---
|
---
|
Loading…
Reference in New Issue
Block a user