python基础 - 函数
2021-03-18 18:24
标签:另一个 code 返回值 last err michael comment plain model def语句一般格式如下: 示例 Python传递不可变对象实例: 普通参数 默认参数 在定义函数时, 可以指定形参的默认值。 如果参数的值没有被传入,则使用默认参数的值。 注意: 定义默认参数要牢记一点:默认参数必须指向不变对象! 可变长参数 定义可变长参数函数如下: 关键字参数 参数组合 变量的作用域 global语句 global语句包含了关键字global,其后跟着一个或多个有逗号分开的变量名。 示例: 一、函数
1.1 def语句
def
1.2 函数参数传递
# python 函数的参数传递:
不可变类型参数“通过值”传递:类似 c++ 的值传递,如 整数、字符串、元组。如fun(a),传递的只是a的值,没有影响a对象本身。比如在 fun(a)内部修改 a 的值,只是修改另一个复制的对象,不会影响 a 本身。
可变类型参数通过“指针”传递:类似 c++ 的引用传递,如 列表,字典。如 fun(la),则是将 la 真正的传过去,修改后fun外部的la也会受影响
python 中一切都是对象,严格意义我们不能说值传递还是引用传递,我们应该说传不可变对象和传可变对象。#!/usr/bin/env python
#-*- coding:utf-8 -*-
def change(a):
a = 5
print(a) ## 结果输出为 5
b = 20
change(b)
print(b) ## 结果为20
实例int对象2 指向他的变量是b, 在传递给change函数时,按传值的方式复制了变量b, a和b都指向了同一个int对象类型, 在a = 5时 则是新生成了一个int值对象为10, 并让a指向它。
Python传递可变对象实例:
#!/usr/bin/env python
#-*- coding:utf-8 -*-
def change1(a):
a.append("Python")
print(a)
L = ["C", "C++", "JAVA"]
change1(L)
print(L)
#输出结果为:
[‘C‘, ‘C++‘, ‘JAVA‘, ‘Python‘]
[‘C‘, ‘C++‘, ‘JAVA‘, ‘Python‘]
# name 叫做函数func的形式参数,简称:形参
def func(name):
print name
# ######### 执行函数 #########
# ‘linux‘ 叫做函数func的实际参数,简称:实参
func(‘linux‘)
# 1. 在执行函数指定实参时,指定参数名传入参数,不需要按顺序
#!/usr/bin/env python
#-*- coding:utf-8 -*-
def printinfo(name, age):
"打印任何传入的字符串"
print("Name:%s" % name)
print("Age:%d" % age)
return
# 调用printinfo函数
printinfo(age=50, name="gg")
1 #!/usr/bin/env python
2 #-*- coding:utf-8 -*-
3 def personalinfo(name, age, address="Beijing"):
4 print("name: %s\tage: %d\taddress: %s" % (name, age, address))
5
6 personalinfo("xiaoming", 25)
7 personalinfo("kiki", 28, "Zhengzhou")
8 #结果:
9 name: xiaoming age: 25 address: Beijing
10 name: kiki age: 28 address: Zhengzhou
def functionname([formal_args,] *var_args_tuple ):
"函数_文档字符串"
function_suite
return [expression]
其中“*” 的变量名会存放所有未命名的变量参数。 如
#!/usr/bin/env python
#-*- coding:utf-8 -*-
def printinfo1(name, *info):
print(name)
print(info)
return
?
printinfo1("xiaoming")
printinfo1("xm", "kiki", "coco", "cici", "yoo")
infolist = ["kiki", "coco", "cici", "yoo"]
printinfo1("xiaoming", *infolist) # 加“*”将列表值传入至函数中
?
#结果:
xiaoming
()
xm
(‘kiki‘, ‘coco‘, ‘cici‘, ‘yoo‘)
xiaoming
(‘kiki‘, ‘coco‘, ‘cici‘, ‘yoo‘)
def person(name, age, **kw):
print(‘name:‘, name, ‘age:‘, age, ‘other:‘, kw)
函数person除了必选参数name和age外,还接受关键字参数kw。在调用该函数时,可以只传入必选参数
>>> person(‘Michael‘, 30)
name: Michael age: 30 other: {}
关键字参数kw,是将dict 的所有k,v用关键字参数传入函数的中, kw 将获取一个dict.
#!/usr/bin/env python
#-*- coding:utf-8 -*-
def person(name, age, **info):
print("name:", name, "age:", age, ‘other:‘, info)
?
person("kk", 28, address="bj", phone="xxxx123", mail="xx@oo.com")
person("zc", 29, **{"address": "bj", "phone": "xxxx123", "mail": "xx@oo.com"})
?
#结果:
name: kk age: 28 other: {‘address‘: ‘bj‘, ‘phone‘: ‘xxxx123‘, ‘mail‘: ‘xx@oo.com‘}
name: zc age: 29 other: {‘address‘: ‘bj‘, ‘phone‘: ‘xxxx123‘, ‘mail‘: ‘xx@oo.com‘}
参数定义的顺序必须是:普通参数、默认参数、可变参数、命名关键字参数和关键字参数。
def f1(a, b, c=0, *args, **kw):
print(‘a =‘, a, ‘b =‘, b, ‘c =‘, c, ‘args =‘, args, ‘kw =‘, kw)
1.3 作用域
# 根据变量的作用域,可以将变量分为全局变量和局部变量。
定义在函数内部的变量拥有一个局部的作用域
在函数外的变量拥有全局作用域
?
局部变量只能在其被声明的函数内部访问,而全局变量可以在整个程序范围内访问。调用函数时,所有在函数内声明的变量名称都将被加入到作用域中。
?
全局变量:
1. 全局变量是位于模块文件内部的顶层的变量名;
2. 全局变量如果在函数内部被赋值的话,必须经过声明;
3. "全局变量名"在函数内部不经过声明也可以被引用。
#!/usr/bin/env python
#-*- coding:utf-8 -*-
total = 0 # 这是一个全局变量
# 可写函数说明
def sum(arg1, arg2):
# 返回2个参数的和."
total = arg1 + arg2 # total在这里是局部变量. "使用的全局变量名"
print("函数内是局部变量 : ", total)
return total
?
# 调用sum函数
sum(10, 20)
print("函数外是全局变量 : ", total)
?
结果:
函数内是局部变量 : 30
函数外是全局变量 : 0
如果想修改一个全局变量:
错误示例:
money = 100
def shoping():
g_price = 20
money -= g_price
print(money)
shoping()
?
会提示错误:UnboundLocalError: local variable ‘money‘ referenced before assignment
修改后:
money = 100
def shoping():
global money
g_price = 20
money -= g_price
print(money)
shoping()
结果为:80
1.4 递归函数
1.5 匿名函数 与返回函数
# 匿名函数
f = lambda x: x*x
f(4)
16
关键字lambda表示匿名函数,冒号前面的x表示函数参数。
# 返回函数
def foo():
name="kc"
def bar():
name="ll"
def tt():
print(name)
return tt
return bar
?
foo()()()
1.6 map/reduce
# map()函数
map()函数接收两个参数,一个是函数,一个是Iterable,map将传入的函数依次作用到序列的每个元素,并把结果作为新的Iterator返回。
如:
s = map(lambda x: x*2, [1,2,3,4,5])
print(list(s)) ## 结果为:[2,4,6,8,10]
由于结果r是一个Iterator,Iterator是惰性序列,因此通过list()函数让它把整个序列都计算出来并返回一个list。
# reduce() 函数
需要导入:from functools import reduce
reduce()把一个函数作用在一个序列[x1, x2, x3, ...]上,这个函数必须接收两个参数,reduce把结果继续和序列的下一个元素做累积计算.
其效果就是:reduce(f, [x1, x2, x3, x4]) = f(f(f(x1, x2), x3), x4)##引出reduce 函数示例:
-----------------------------------------------------------------------
初始:
l = [3, 2, 10, 2]
# lambda x, y: x * y
def reduce_test(arr):
res = 1
for i in arr:
res *= i
return res
?
print(reduce_test(l))
这样写太局限,只能算两个数的乘法
--------------------------------------------------------------------------------
修改:
l = [3, 2, 10, 2]
def reduce_test(func, arr):
res = arr.pop(0)
for i in arr:
res = func(res, i)
return res
?
print(reduce_test(lambda x, y: x*y, l))
print(reduce_test(lambda x, y: x+y, l))
print(reduce_test(lambda x, y: x/y, l))
print(reduce_test(lambda x, y: x%y, l))
--------------------------------------------------------------------------------
再修改:
l = [3, 2, 10, 2]
def reduce_test(func, arr, init_n=None):
if init_n is None:
res = arr.pop(0)
else:
res = init_n
for i in arr:
res = func(res, i)
return res
?
print(reduce_test(lambda x, y: x*y, l, 100))
--------------------------------------------------------------------------------
#!/usr/bin/env python
#-*- coding:utf-8 -*-
from functools import reduce
def add(x, y):
return x + y
l = reduce(add, [1, 2, 3, 34, 44, 54, 65, 5])
print(l) ##结果: 208
## 1.将数字列表转换为整数,如[14,59,1,3,2] 转为1459132
?
#!/usr/bin/env python
#-*- coding:utf-8 -*-
from functools import reduce
def fm(x, y):
return x * 10 + y
s = reduce(fm, [12,3,4,9,88])
print(s) ##结果:123578
?
## 2. 将str转为int
#!/usr/bin/env python
#-*- coding:utf-8 -*-
from functools import reduce
digits1 = {‘0‘: 0, ‘1‘: 1, ‘2‘: 2, ‘3‘: 3, ‘4‘: 4, ‘5‘: 5, ‘6‘: 6, ‘7‘: 7, ‘8‘: 8, ‘9‘: 9}
def str2int(strings1):
def fh(x, y):
return x * 10 + y
def char2int(s1):
return digits1[s1]
return reduce(fh, map(char2int, strings1))
?
result = str2int("76887612")
print(result)
1.7 filter
filter() 函数用于过滤序列,过滤掉不符合条件的元素,返回由符合条件元素组成的新列表。
filter函数的语法:
filter(function, iterable) 第一个为函数,第二个为序列,序列的每个元素作为参数传递给函数进行判断,然后返回 True 或 False,最后将返回 True 的元素放到新列表中。
Python3.x 返回迭代器对象,
#功能相近的函数:
mList = ["as_sfas","axjks_python", ‘python‘, "linx", ‘nihao‘]
def show(s):
return s.endswith("python")
def filter_test(func, arr):
new_l = []
for i in arr:
if not func(i):
new_l.append(i)
return new_l
res = filter_test(show, mList)
print(res)
?
或者输入: filter_test(lambda n: n.endswith("python"), mList)
?
使用filter() 函数:
print(list(filter(lambda x: not x.endswith("python"), mList))) 结果和上述一样
?
## 示例1
def is_odd(n):
eturn n % 2 == 1
res1 = list(filter(is_odd, [1, 3, 2, 4, 6, 21, 32, 45, 76]))
print(res1) ## 结果:[1, 3, 21, 45]
二、Python内置函数
>>> dir(__builtins__) 可以查看内置函数
?
# 1. all()函数
用于判断给定的可迭代对象中的元素是否都为true, 是返回True, 否返回False
元素除了是 0、空、None、False 外都算 True。
函数等价于:
def all_test(iterable):
for e in iterable:
if not e:
return False
return True
语法:all(iterable)
# 2. any()函数 用于判断给定的可迭代参数 iterable 是否全部为 False, 是返回False, 一个为True,则为True
# 3. bin(number) 转为二进制
# 4. bool() 函数用于将给定参数转换为布尔类型,如果没有参数,返回 False。
# 5. bytes()
bytes(iterable_of_ints) -> bytes
bytes(string, encoding[, errors]) -> bytes
bytes(bytes_or_buffer) -> immutable copy of bytes_or_buffer
bytes(int) -> bytes object of size given by the parameter initialized with null bytes
bytes() -> empty bytes object
>>> bytes("zkchang", encoding=‘utf-8‘) # 字符串 编码
b‘zkchang‘
>>> bytes("中国", encoding=‘utf-8‘)# 字符串 编码
b‘\xe4\xb8\xad\xe5\x9b\xbd‘
>>> bytes("中国", encoding=‘utf-8‘).decode() ## 解码
‘中国‘
## 用什么编码, 就用什么解码
>>> bytes("中国",encoding=‘gbk‘)
b‘\xd6\xd0\xb9\xfa‘
>>> bytes("中国",encoding=‘gbk‘).decode(‘gbk‘)
‘中国‘
# chr() 转化为Ascii码 ord()函数功能与chr() 相反
>>> chr(1)
‘\x01‘
>>> chr(110)
‘n‘
# divmod() 函数把除数和余数运算结果结合起来,返回一个包含商和余数的元组(a // b, a % b)。
>>> divmod(10,3)
(3, 1)
# eval() 函数用来执行一个字符串表达式,并返回表达式的值
eval(expression[, globals[, locals]])
expression -- 表达式。
globals -- 变量作用域,全局命名空间,如果被提供,则必须是一个字典对象。
locals -- 变量作用域,局部命名空间,如果被提供,可以是任何映射对象。
>>> eval(‘3*4‘)
12
>>> g = {‘num‘:2}
>>> eval(‘num + 2‘,g)
4
>>> g = {‘num1‘:2}
>>> l = {‘num2‘:4}
>>> eval(‘num1+num2‘,g,l)
6
# hash() 用于获取取一个对象(字符串或者数值等)的哈希值。
可哈希的数据类型为不可变数据类型
>>> hash([1,2,3])
Traceback (most recent call last):
File "