Python 函数

1. 函数的定义

def func1():        # 带返回值的函数
    print('xiaojingzi')
    return 0

def func2():        # 没有返回值的函数
    print('xiaojunzi')    

func1()    # 调用函数

2. 函数的参数

2.1 形参与实参

def fun(a, b)         # a, b 是形参 
    print(a + b)

fun(2, 3)        # 2, 3是实参

2.2 默认参数

def person(name, age, country='China'):
    print(name)
    print(age)
    print(country)

默认参数参数可以输入,也可以不输入,一般而言默认参数放在最后
person('xiaojingzi', 20)
person('xiaojunzi', 30, 'USA')

2.3 关键参数

def person(name, age):
    print(name)
    print(age)

person('xiaojingzi', 30)
person(age=10, name='xiaojingzi')    # 位置参数调用,形参一一对应,关键参数调用,不需要一一对应,

2.4 非固定参数

当不确定需要传入几个参数时,可以采用非固定参数

def test(*args):       # 接收n个位置参数,转换成元组形式
    print(args[1])


# 两种调用形式
test(*[1, 2, 3, 4])
test(1, 2, 3, 4, 5)

def tes(**kargs):     # n个关键字,转换成字典的格式
    print(kargs)
    print(kargs['name'])
    print(kargs['xiao'])


tes(name='alex', age='8', sex='nv', xiao='xiaojingzi')
tes(**{'name': 'alex', 'xiao': 'xkaojunzi'})      # 两种调用形式

2.5 函数的变量

def change_name():      
    name[0] = 'xiaojingzi'
    print('inside func', name)
# 列表,字典,集合,类可以在函数中修改,整数,字符串不可以在函数中修改

3. 递归函数

def calc(n):
    if n < 10:
        pass
    else:
        print(n/2)
        return calc(n/2)

calc(50)
# 递归:1. 必须有一个明确的结束条件
#2. 每次进入更深一层递归时,问题规模相比上次递归都应有所减少
#3. 递归效率不高,递归层次过多会导致栈溢出(在计算机中,函数调用是通过栈(stack)这种数据结构实现的,每当进入一个函数调用,栈就会加一层栈帧,每当函数返回,栈就会减一层栈帧。由于栈的大小不是无限的,所以,递归调用的次数过多,会导致栈溢出)

4.  匿名函数

插入map()函数的用法:

map()是 Python 内置的高阶函数,它接收一个函数 f 和一个 list,并通过把函数 f 依次作用在 list 的每个元素上,得到一个新的 list 并返回。

#1、当seq只有一个时,将函数func作用于这个seq的每个元素上,并得到一个新的seq。 
def f(x):
    return x*x
print map(f, [1, 2, 3, 4, 5, 6, 7, 8, 9])
# 输出结果:
[1, 4, 9, 10, 25, 36, 49, 64, 81]

# 2. 当seq多于一个时,map可以并行(注意是并行)地对每个seq执行如下图所示的过程:

# python3中可以处理类表长度不一致的情况,但无法处理类型不一致的情况,
l4=map(lambda x,y:(x**y,x+y),[1,2,3],[1,2])
for i in l4:
    print(i)
#(1, 2)    (4, 4)

l4=map(lambda x,y:(x**y,x+y),[1,2,3],[1,2,'a'])    # 报错
for i in l4:
    print(i)

匿名函数的使用

res = map(lambda x:x**2,[1,5,7,4,8])
for i in res:
    print(i)

5. 高阶函数

变量可以指向函数,函数的参数能接收变量,那么一个函数就可以接收另一个函数作为参数,这种函数就称之为高阶函数。

def add(x,y,f):
    return f(x) + f(y)
 
 
res = add(3,-6,abs)
print(res)

6.  内置函数

内置参数详解 https://docs.python.org/3/library/functions.html?highlight=built#ascii 

#compile
f = open("函数递归.py")
data =compile(f.read(),'','exec')
exec(data)


#print
msg = "又回到最初的起点"
f = open("tofile","w")
print(msg,"记忆中你青涩的脸",sep="|",end="",file=f)


# #slice
# a = range(20)
# pattern = slice(3,8,2)
# for i in a[pattern]: #等于a[3:8:2]
#     print(i)
#
#


#memoryview
#usage:
#>>> memoryview(b'abcd')
#<memory at 0x104069648>
#在进行切片并赋值数据时,不需要重新copy原列表数据,可以直接映射原数据内存,
import time
for n in (100000, 200000, 300000, 400000):
    data = b'x'*n
    start = time.time()
    b = data
    while b:
        b = b[1:]
    print('bytes', n, time.time()-start)

for n in (100000, 200000, 300000, 400000):
    data = b'x'*n
    start = time.time()
    b = memoryview(data)
    while b:
        b = b[1:]
    print('memoryview', n, time.time()-start)

几个内置方法用法提醒

 

posted @ 2018-07-31 20:50  风影旋新月  阅读(178)  评论(0编辑  收藏  举报