函数,
Posted sunlizhao
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了函数,相关的知识,希望对你有一定的参考价值。
定义:函数是指将一组语句的集合通过一个名字(函数名)封装起来,想执行这个函数,调用函数名
特性:减重,可扩展,易维护
def calc(x,y):
res = x**y
return res #1return会结束函数,后面的代码不会执行 2返回res给calc
print res
calc(2,10) #调用
返回值return,返回给调用者,如果没有返回值,默认返回none
参变量只有在被调用时才分配内存单元,在调用结束时,即刻释放所分配的内存单元。因此,形参只在函数内部有效。函数调用结束返回主调用函数后则不能再使用该形参变量
实参可以是常量、变量、表达式、函数等,无论实参是何种类型的量,在进行函数调用时,它们都必须有确定的值,以便把这些值传送给形参。因此应预先用赋值,输入等办法使参数获得确定值
def print_info(age,name,sex = \'male\'):
print(\'Name: %s\'%name)
print("Age: %d"%age)
print(\'Sex: %s\'%sex)
print_info(19,\'孙礼昭\')#顺序参数
print_info(name = \'slz\',age=19)#关键字参数
print_info(19,\'slz\')#默认参数
#不定长参数 参数前面加个*号,可以获取多个值(做成元组)
# **号 做成字典 用于关键字参数
def add2(*arge):
sum1 = 0
for i in arge:
sum1 += i
print(sum1)
add2(1,2,3,4,5)
# 位置关系 从左到右顺序是
# 顺序参数,关键字参数--->默认参数--->*不定长参数--->**不定长参数
#name --> name = \'slz\' --> *arg --> **kwargs
#使用*和**时,要注意顺序 *一定要放在前面(左).. **一定要放在后面(右)
递归:在函数内部,可以调用其它函数.如果一个函数在内部调用它自身,这个函数就是递归函数
def calc(n):
print(\'n:\'n)
if int(n/2) == 0:
return n
return calc(int(n/2))
calc(10)
递归特性:
必须有一个明确的结束条件
每次进入更深一层递归时,问题规模相比上次递归有所减少
递归效率不高,递归层次过多会导致栈溢出
实例:二分查找
data
=
[
1
,
3
,
6
,
7
,
9
,
12
,
14
,
16
,
17
,
18
,
20
,
21
,
22
,
23
,
30
,
32
,
33
,
35
]
def
binary_search(dataset,find_num):
print
(dataset)
if
len
(dataset) >
1
:
mid
=
int
(
len
(dataset)
/
2
)
if
dataset[mid]
=
=
find_num:
#find it
print
(
"找到数字"
,dataset[mid])
elif
dataset[mid] > find_num :
# 找的数在mid左面
print
(
"\\033[31;1m找的数在mid[%s]左面\\033[0m"
%
dataset[mid])
return
binary_search(dataset[
0
:mid], find_num)
else
:
# 找的数在mid右面
print
(
"\\033[32;1m找的数在mid[%s]右面\\033[0m"
%
dataset[mid])
return
binary_search(dataset[mid
+
1
:],find_num)
else
:
if
dataset[
0
]
=
=
find_num:
#find it
print
(
"找到数字啦"
,dataset[
0
])
else
:
print
(
"没的分了,要找的数字[%s]不在列表里"
%
find_num)
binary_search(data,
66
)
变量作用域
Python 中,程序的变量并不是在哪个位置都可以访问的,访问权限决定于这个变量是在哪里赋值的。
变量的作用域决定了在哪一部分程序可以访问哪个特定的变量名称。Python的作用域一共有4种,分别是:
- L (Local) 局部作用域
- E (Enclosing) 闭包函数外的函数中
- G (Global) 全局作用域
- B (Built-in) 内建作用域
以 L –> E –> G –>B 的规则查找,即:在局部找不到,便会去局部外的局部找(例如闭包),再找不到就会去全局找,再者去内建中找。
x = int(2.9) # 内建作用域
g_count = 0 # 全局作用域
def outer():
o_count = 1 # 闭包函数外的函数中
def inner():
i_count = 2 # 局部作用域
Python 中只有模块(module),类(class)以及函数(def、lambda)才会引入新的作用域,
全局变量和局部变量
定义在函数内部的变量拥有一个局部作用域,定义在函数外的拥有全局作用域
def fun():
numm*=2
print(\'函数内部调用numm\',numm)
numm = 1
print(\'初始化numm:\',numm)
fun()
print(\'函数外部调用numm\',numm)
报错了。这是因为在fun()函数使用了局部变量num1,它只是个跟全局变量同名的局部变量,使用前还是要赋值,因此再次强调不要这样使用
如果真的想要在函数体内修改全局变量的值,就要使用global关键字
def fun():
global numm
numm *= 5
print(\'函数内部调用numm\',numm)
numm = 1
print(\'初始化numm:\',numm)
fun()
print(\'函数外部调用numm\',numm)
想调用函数外层的,但不是全局变量,就用nonlocal关键
def fun2():
num2 = 3
def fun3():
nonlocal num2
num2 *= 2
print(\'num2=\',num2)
return 18
return fun3()
print(fun2())
以上是关于函数,的主要内容,如果未能解决你的问题,请参考以下文章
在 Visual Studio 中创建构造函数的代码片段或快捷方式