1.什么是函数
我们在写程序的时候会多次使用重复的代码,函数就可以简化这种重复。我们在函数里写重复的内容, 然后等需要使用的时候直接调用就可以
Python
函数定义的通常格式为:1
2
3
4def 函数名(参数列表):
#函数的第一行语句可以选择性地使用文档字符串—用于存放函数说明
函数体
#return [表达式] 结束函数,选择性地返回一个值给调用方。不带表达式的return相当于返回 None- 定义函数
先进入到python
的命令行模式1
2
3
4
5
6➜ ~ source yiluo/bin/activate
(yiluo) ➜ ~ python3
Python 3.7.5 (default, Nov 29 2019, 14:32:46)
[Clang 9.0.0 (clang-900.0.39.2)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> - 创建一个输出任意范围内
Fibonacci
数列的函数:【1】.1
2
3
4
5
6
7
8
9def fib(n):
0, 1 a, b =
while a<n:
' ') print(a, end=
a, b = b, a+b
print()
...
2000) fib(
0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597def
关键字定义函数
【2】.函数体的第一个语句可以(可选的)是字符串
文字
【3】.函数的 执行 会引入一个用于函数局部变量
的新符号表
【4】.在函数被调用时,实际参数(实参
)会被引入被调用函数的本地符号表中
【5】.函数名称的值具有解释器
将其识别为用户定义函数的类型。这个值可以分配给另一个名称1
2
3
4
5fib
<function fib at 0x10726a290>
f = fib
100) f(
0 1 1 2 3 5 8 13 21 34 55 89 - 写一个返回
斐波那契数列
的列表(而不是把它打印出来)的函数1
2
3
4
5
6
7
8
9
10
11
12def fib2(n):
result = []
0, 1 a, b =
while a<n:
result.append(a)
a, b =b ,a+b
return result
...
100) f100 = fib2(
f100
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]
>>>2.内置函数
内置函数就是Python
解释器中不用引入任何包,一直可以使用的函数义和调用 - 常用的
len
type
abs
来看一下1
2
3
4
5
6
7
8'hello' a =
len(a)
5
type(a)
<class 'str'>
>>> b = -1
abs(b)
1len
获取来字符串的个数type
获取了类型是字符串abs
是绝对值函数-1
的绝对值是1
3.变量作用域
局部变量
和全局变量
- 创建一个文件,然后
vim
进行编辑1
2(yiluo) ➜ Code touch a.py
(yiluo) ➜ Code vim a.py1
2
3
4
5
6
7
8
9
10#!/usr/bin/env python3
def demo():
n = 100
print(n)
n = 1
print("Before demo ", n)
print("Inside demo", end=' ')
demo()
print("After demo", n) - 保存文件然后命令行执行看一下结果以上
1
2
3
4(yiluo) ➜ Code python a.py
Before demo 1
Inside demo 100
After demo 1n=1
是全局变量,n=100
是局部变量 global
关键字1
2
3
4
5
6
7
8
9
10
11#!/usr/bin/env python3
def demo2():
global n
n = 100
print(n)
n = 1
print("Before demo2", n)
print("Inside demo2", end=' ')
demo2()
print("After demo2", n)- 保存文件,然后在命令行模式下运行
1
2
3
4(yiluo) ➜ Code python b.py
Before demo2 1
Inside demo2 100
After demo2 1004.函数的参数
Python
常用参数有四种:必选参数
、默认参数
、可变参数
和关键字参数
- 必选参数
1
2
3
4
5
6
7def student(name, age):
"NAME: ", name) print(
"AGE: ", age) print(
...
'yiluo', 18) student(
NAME: yiluo
AGE: 18 - 也可是使用参数名进行传参
1
2
3'yiluo', age=18) student(name=
NAME: yiluo
AGE: 18 - 默认参数如果不传年龄会自动给出默认年龄值
1
2
3
4
5
6
7
8
9
10def student(name, age=18):
"NAME: ", name) print(
"AGE: ", age) print(
...
'yiluo') student(
NAME: yiluo
AGE: 18
'yiluo', 20) student(
NAME: yiluo
AGE: 20 - 可变参数
可变参数的定义格式是在参数名前面加上*
,参数名可以自定义,通常写成*args
学生的得分分别是1
2
3
4
5
6
7
8
9def student(name, age=19, *score):
"NAME: ", name) print(
"AGE: ", age) print(
"SCORE: ", score) print(
...
'yiluo',19,88,90,100) student(
NAME: yiluo
AGE: 19
SCORE: (88, 90, 100)88
,90
,100
- 关键字参数
关键字参数的定义格式是在参数名前面加上**
,参数名可以自定义,通常写成**kw
1
2
3
4
5
6
7
8
9def student(name, age, **score):
"NAME: ", name) print(
"AGE: ", age) print(
"SCORE: ", score) print(
'数学':'88', '语文':'90','英语':'100'} score = {
'yiluo', 19, **score) student(
NAME: yiluo
AGE: 19
SCORE: {'数学': '88', '语文': '90', '英语': '100'} - 命名关键字参数
前文提到,必选参数
、默认参数
、可变参数
在赋值时都可以不写参数名,而命名关键字参数
恰好相反, 赋值时必须写上参数名1
2
3
4
5
6
7
8
9def student(*, name):
"Hello", name) print(
...
'yiluo') student(
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: student() takes 0 positional arguments but 1 was given
'yiluo') student(name=
Hello yiluo……待续
享受每一天,Just Enjoy !