函数关键字
在Python中,定义一个函数要使用def语句,依次写出函数名、括号、括号中的参数和冒号:,然后,在缩进块中编写函数体,函数的返回值用return语句返回。
函数的定义
我们以自定义一个求绝对值的my_abs函数为例:
def my_abs(x):
if x >= 0:
return x
else:
return -x
Python 定义函数使用 def 关键字,一般格式如下:
def 函数名(参数列表):
函数体
函数参数与作用域
以下是调用函数时可使用的正式参数类型:
必备参数
关键字参数
默认参数
不定长参数
- 位置传递实例:
def fun(a,b,c)
return a+b+c
print(f(1,2,3))
- 关键字传递
关键字(keyword)传递是根据每个参数的名字传递参数。关键字并不用遵守位置的对应关系。
def fun(a,b,c)
return a+b+c
print(f(1,c=3,b=2))
- 参数默认值
在定义函数的时候,使用形如c=10的方式,可以给参数赋予默认值(default)。如果该参数最终没有被传递值,将使用该默认值。
def f(a,b,c=10):
return a+b+c
print(f(3,2))
print(f(3,2,1))
在第一次调用函数f时, 我们并没有足够的值,c没有被赋值,c将使用默认值10.第二次调用函数的时候,c被赋值为1,不再使用默认值。
- 包裹传递
在定义函数时,我们有时候并不知道调用的时候会传递多少个参数。这时候,包裹(packing)位置参数,或者包裹关键字参数,来进行参数传递,会非常有用。
下面是包裹位置传递的例子:
def func(*name):
print type(name)
print name
func(1,4,6)
func(5,6,7,1,2,3)
两次调用,尽管参数个数不同,都基于同一个func定义。在func的参数表中,所有的参数被name收集,根据位置合并成一个元组(tuple),这就是包裹位置传递。
为了提醒Python参数,name是包裹位置传递所用的元组名,在定义func时,在name前加*号。
下面是包裹关键字传递的例子:
def func(**dict):
print type(dict)
print dict
func((1,9))
func("a":2,"b":1,"c":11)
与上面一个例子类似,dict是一个字典,收集所有的关键字,传递给函数func。为了提醒Python,参数dict是包裹关键字传递所用的字典,在dict前加**。
包裹传递的关键在于定义函数时,在相应元组或字典前加*或**。
- 解包裹
和*,也可以在调用的时候使用,即解包裹(unpacking), 下面为例:
def func(a,b,c):
print a,b,c
args = (1,3,4)
func(*args)
dict = {'a':1,'b':2,'c':3}
func(**dict)
在这个例子中,所谓的解包裹,就是在传递tuple时,让tuple的每一个元素对应一个位置参数。在调用func时使用*,是为了提醒Python:我想要把args拆成分散的三个元素,分别传递给a,b,c。
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)才会引入新的作用域,其它的代码块(如 if/elif/else/、try/except、for/while等)是不会引入新的作用域的,也就是说这些语句内定义的变量,外部也可以访问
函数返回值
return [表达式] 语句用于退出函数,选择性地向调用方返回一个表达式。不带参数值的return语句返回None。
# 可写函数说明
def sum( arg1, arg2 ):
# 返回2个参数的和."
total = arg1 + arg2
print ("函数内 : ", total)
return total
习题
- 实现random.sample方法
dlist = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
slice = random.sample(dlist, 5) # 从list中随机获取5个元素,作为一个片断返回
print (slice)
print (dlist) # 原有序列并没有改变
[7, 5, 6, 9, 8]
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
import random
def get_random_sample(data_list, k):
temp = []
while True:
x = random.randint(0,len(data_list))
temp.append(data_list[x-1])
if len(set(temp)) >= k:
break
return list(set(temp))
print(get_random_sample(dlist, 5))
- 实现Max方法
dlist = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
print (max(dlist))
10
def get_max(x):
"查找参数x的最大值"
Len = len(x)
max_value = x[0]
for i in range(1,Len):
if x[i]>= max_value:
max_value = x[i]
return max_value
- 实现判断两个字符串是否相等的方法
1、比较字符串是否相同:
==:使用==来比较两个字符串内的value值是否相同
is:比较两个字符串的id值。
2、字符串的长度比较
len():显示字符串的长度,返回数字整型。可以进行长度的比较。
3、使用比较运算符
>、<、> = 、< =、比较的规则为:从第一个字符开始比较,排序在前边的字母为小,当一个字符串全部字符和另一个字符串的前部分字符相同时,长度长的字符串为大。
a = '256'
b = '256'
print(id(a))
print(id(b))
print(a == b)
2206964433168
2206964433168
True
def compare_equal(a, b):
if not len(a) == len(b):
return False
for i in range(len(a)):
if not a[i] == b[i]:
return False
return True
参考文献
https://www.cnblogs.com/nkwy2012/p/6023719.html
https://www.cnblogs.com/python-dd/p/9368078.html