函数
函数语法+基础使用
语法
def 函数名([参数]):
语句块
[return]
基础使用 - format[格式化]
def printinfo(name, age):
print('Name:{0},Age:{1}'.format(age, name))
print("name:{0},age:{1}".format(age, name))
printinfo(age=8, name='小马') # Name:小马,Age:8
函数的可变参数
单纯的存入参数
def test(arg1):
print(arg1)
test(12)
# 输出:12
变成元组
一个*
号,变成元组
def test(arg1, *arg2):
print(arg1, arg2)
test(12, 23, 34, 34)
# 输出:12 (23, 34, 34)
变成字典
俩个*
号,变成字典,同时注意传入参数的类型
def test(arg1, *arg2, **arg3):
print(arg1, arg2, arg3)
test(12, 23, 34, 34, a = 12, b = 23)
#输出:12 (23, 34, 34) {'a': 12, 'b': 23}
函数的返回
def add(a, b):
return a+b
print(add(12, 34))
print(add([1, 2, 3], [4, 5, 6]))
'''输出结果:
46
[1, 2, 3, 4, 5, 6]
'''
函数中的%
%.2f
可以输出价格- 也可以用逗号
,
直接输出对应的结果
用上者的理由:方便啊,如果要传入好几个参数,一个个分开用逗号,超级不方便
def discounts(price, rate):
final_price = price * rate
return final_price
old_price = float(input('请输入原价:')) # 98
rate = float(input('请输入折扣率:')) # 0.9
new_price = discounts(old_price, rate)
print('打折后价格是:%.2f' % new_price) # 88.20
print('打折后价格是:', new_price) # 88.2
函数中的全局变量-global
num = 1
def test():
global num
print(num) # 1
num = 123
print(num) #123
test()
print(num) #123
函数的多层调用
- 不可以直接调用到函数(
num1
)里面的函数(num2
) - 可以在大函数(
num1
)里面调用内置函数(num1
) - 最后只用调用最大的函数(
num1
)
def num1(): #num1在这里调用
print("num1在这里调用")
def num2():
print("num2开始调用!")
num2() #num2开始调用!
num1()
'''
num1在这里调用
num2开始调用!
'''
# num2() 无法直接调用
函数的闭包
- 都是通过
get
返回值
def make_counter(init):
counter = [init]
def inc(): counter[0] += 1
def dec(): counter[0] -= 1
def get(): return counter[0]
def reset(): counter[0] = init
return inc, dec, get, reset
inc, dec, get, reset = make_counter(0)
inc()
inc()
inc()
print(get()) # 3
dec()
print(get()) # 2
reset()
print(get()) # 0
用nonlocal改变闭包里面的值
- 直接把
num
的值改变了,最后的值也变成了修改值333
def a():
num = 100
def b():
nonlocal num
num = 333
print(num) # 333
b()
print(num) #333
a()
函数的递归调用
递归和之前c与Java使用是一样的
def fun(n):
if n == 1:
return 1
if n == 2:
return 1
return fun(n-1)+fun(n-2)
n = int(input("please input the num of 'n': "))
print(fun(n))
函数的匿名类
num = lambda arg1, arg2: arg1+arg2
print(num(12, 34))
# 46
函数的匿名类和混合使用
num1 = lambda i: i%2 == 1
num2 = filter(num1,[1,2,3,4,4,5,6,7,8,9])
print(list(num2))
# [1, 3, 5, 7, 9]
面试题:进程和线程的区别和联系?
进程 - 操作系统分配内存的基本单位 - 一个进程可以包含一个或多个线程
线程 - 操作系统分配CPU的基本单位
并发编程(concurrent programming)
- 提升执行性能 - 让程序中没有因果关系的部分可以并发的执行
- 改善用户体验 - 让耗时间的操作不会造成程序的假死