友情提示:380元/半年,儿童学编程,就上码丁实验室。
可爱的小朋友们,今天我们来学习一下Python函数吧~
什么是函数
定义函数和函数调用
定义函数格式:
def 函数名(参数1,参数2…):
函数体
函数调用格式:
函数名()
案例:
def MyFirstFunction():
print('我定义的第一个函数')
MyFirstFunction()
函数返回值 return
在函数中使用return关键字可以返回结果
案例:
def add(num1,num2): >
return num1+num2
2,3) > add(
5
形参和实参
形参是函数定义过程中的参数;实参是传递进来的参数
案例:
def MyFunction(name):
print('传递进来的'+name+'叫实参,因为是具体的参数值')
MyFunction('小鱼儿')
参数:关键字参数、默认参数、可变参数
关键字参数
def Say(name,words): >
print(name+'->'+words)
'sky',words='you are the best') > Say(name=
sky->you are the best
默认参数
默认参数是赋初始值,如果忘记传一个参数,也不会报错
案例:定义一个带有默认参数的函数,如果没有传入,打印 ‘hello Python‘,如果传入,打印 ‘hello xxx’
def greet(name="Pyhton"): >
print('hello',name)
> greet()
hello Pyhton
'php') > greet(
hello php
>
可变参数
def test(*params):
print('参数长度是:',len(params));
print('第二个参数是:',params[1]);
1,'sky',3.14,4,5.6) test(
参数长度是: 5
第二个参数是: sky
注意:若可变参数后面有别的参数,需要赋值
def test(*params,exp):
print('参数长度是:',len(params));
print('第二个参数是:',params[1]);
1,2,'sky',2.2,exp=9) test(
参数长度是: 4
第二个参数是: 2
>>>
变量作用域
Python的作用域一共有4种,分别是:
L (Local) 局部作用域
E (Enclosing) 闭包函数外的函数中
G (Global) 全局作用域
B (Built-in) 内置作用域(内置函数所在模块的范围)
以 L –> E –> G –>B 的规则查找,即:在局部找不到,便会去局部外的局部找(例如闭包),再找不到就会去全局找,再者去内置中找。
注意:Python 中只有模块(module),类(class)以及函数(def、lambda)才会引入新的作用域,其它的代码块(如 if/elif/else/、try/except、for/while等)是不会引入新的作用域的,也就是说这些语句内定义的变量,外部也可以访问。
函数作用域:局部变量、全局变量
局部变量是在函数内部定义的变量。全局变量是在函数外定义的变量。
局部变量只能在其被声明的函数内部访问,而全局变量可以在整个程序范围内访问。
total=0 #这是一个全局变量
def multiplication(x,y):
total=x*y #total在这里是局部变量
print('函数内是局部变量:',total)
return total
#调用函数
multiplication(4,5)
print('函数外是全局变量:',total)
输出结果
E:pythonpython.exe F:/pythondemo/gui_1.py
函数内是局部变量:20
函数外是全局变量:0
global关键字和nonlocal关键字
当内部作用域想修改外部作用域的变量时,就要用到global和nonlocal关键字了。
如果要修改嵌套作用域(外层非全局作用域)中的变量则需要 nonlocal 关键字了,如下实例:
global
有必要在函数中修改全局变量,使用global
5 > count=
def MyFun(): >
global count
count=10
print(10)
> MyFun()
10
> print(count)
10
nonlogal
def out():
num1 = 10
def inner():
nonlocal num1 # nonlocal关键字声明
num1 = 20
print(num1)
inner()
print(num1)
out()
运行结果
20
20
闭包
一个内部函数里,对于外部作用域的(但不是在全局作用域的变量)变量引用,内部函数认为是闭包
def FunX(x): >
def FunY(y):
return x*y
return FunY
8)(5) > FunX(
40
匿名函数
格式:
lambda 原函数的参数:原函数的返回值
lambda [arg1 [,arg2,.....argn]]:expression
def add(x,y): >
return x+y
3,4) > add(
7
y:x+y > g=lambda x,
3,4) g(
7
递归
定义:函数调用自身过程
应用:
A:汉诺塔游戏
B:树结构的定义
案例:
汉诺塔游戏
http://baike.baidu.com/view/191666.htm
游戏说明:
我们对柱子编号为x, y, z,将所有圆盘从x移到z可以描述为:
<1>如果x只有一个圆盘,可以直接移动到z;
<2>如果x有N个圆盘,可以看成x有1个圆盘(底盘) + (N-1)个圆盘,首先需要把 (N-1) 个圆盘移动到 y,然后,将 x的最后一个圆盘移动到z,再将y的(N-1)个圆盘移动到z。
请编写一个函数,给定输入 n, x, y, z,打印出移动的步骤:
def hanoi(n, x, y, z):
if n == 1:
print(x, '-->', z)
else:
hanoi(n - 1, x, z, y) # 将前n-1个盘子从x移动到y上
print(x, '-->', z) # 将最底下的最后一个盘子从x移动到z上
hanoi(n - 1, y, x, z) # 将y上的n-1个盘子移动到z上
n = int(input('请输入汉诺塔的层数:'))
hanoi(n, 'X', 'Y', 'Z')
THE END