2019-05-18

函数

  • 传参
    1.两种传参方式
#两种传参方式:按位置,关键字
#函数如果有默认值,则必须放在最后
full_name = get_fullname('于','tongtng')
#print(full_name)
print(get_fullname('tongtong')

ps:求全名

def get_fullname(last_name,first_name):
    '''
    求全名
    :param last_name: 姓
    :param first_name: 名
    :return: 全名
    '''
    full_name = last_name + first_name
    return  full_name

2.变长参数

# *将参数都放置到一个元组中
def  self_print(name,*a):
    print(a)
    print(type(a))

self_print(1,2,3,4,5,6)
# **将参数都放到字典中
def d_self_print(**kwargs)
    print(kwargs)
d_self_print(last_name='shun',first_name='tong')    
#形参顺序:位置参数->元组->字典
def mix(name,*t,*kw)
    print(name)
    print(t)
    print(kw)
    
mix('shun',20,'tongtong',tongtong='女'

*有拆开元组和列表的作用
**有拆开字典的作用

t = (1,2,3,4,5)
print(*t)
def f(*tt)
    print(kw)
f(*[1,2,3,4,5])

def ff(*kwargs)
    print(kwargs)
ff(**{'name':'tongtong','age':20})

3.返回值

def sum_and_avg(*numbers):
    total = sum(numbers)
    avg_number = total / len(numbers)
    
    return  total,avg_number
sum,avg = sum_and_avg(1,2,3,4,5,6,7,8,9,10)
print("总和是%f" % sum)
print("平均值是%f" % avg)

4.传参问题
函数的传参问题
数据分为引用类型,普通类型
python中的基本数据类型都是普通类型。数,布尔型,字符串型
除了这些之外的类型都是引用类型
普通类型赋值的时候,传的是值
引用类型赋值的时候,传的是址

l1 = [1,2,3,4,5]
l2 = l1

l2[1] = 5
print(l1)

a = 5
b = a
b = 10
print(a)

ps:传参的本质就是赋值操作,如果传递的是引用类型数据,则需要注意是否在函数中对其做出了修改

def power(numbers):
    #numbers = [x**2 for x in numbers]
    #numbers[9] = 10 
    #创建数据副本
    #numbers = numbers[:]
    numbers = list(numbers)
    numbers[3] = 10
    return  numbers
nums = [1,2,3,4,5,6,7,8,9,10]
print(power(nums))
print(nums)

5.闭包
闭包:闭包的本质是函数嵌套函数,外层函数返回内层函数的地址

def fun():
    print("hello world")
#函数名的本质是函数的地址
f = fun
f()
def outter():
    #a = 10
    def inner():
        a = 20
        print(a)
        print("hello world")
        print("-------")
        print(a)
    return inner
fo = outter()
fo()
#内层函数可以访问外层函数的变量,但是不能修改
#内层函数访问变量时会先从自己内部查找,如果找不到,就会层层向上查找
def outter():
    #a = 10
    def inner():
        #说明使用的是外层变量
        global aa
        aa == 1
        '''
        print(aa)
        print("hello world")
        print("-------")
        print(a)
        '''
    return inner
fo = outter()
fo()

内层函数可以访问外层函数的变量,但是不能修改
内层函数访问变量时会先从自己内部查找,如果找不到,就会层层向上查找
python中,变量的作用域是以函数为单位的
global修饰变量时,说明使用的是最外层的全局变量
nonlocal修饰变量时,说明使用的是嵌套层函数的变量

def outter():
    #a = 10
    def inner():
        #说明使用的是外层变量
        global aa
        aa == 1
        '''
        print(aa)
        print("hello world")
        print("-------")
        print(a)
        '''
    return inner
fo = outter()
fo()
def outter():
    a = 10
    def inner():
        #说明使用的是外层变量
        nonlocal aa
        aa == 1
        print(aa)
        '''
        print(aa)
        print("hello world")
        print("-------")
        print(a)
        '''
    return inner
fo = outter()
fo()

例:斐波那契数列:1 1 2 3 5 8 13

#用递归实现
def fibonacci(n):
    if n == 1 or n == 2:
        return 1
    return fibonacci(n-1)+fibonacci(n-2)
for i in range(1,6):
    print(fibonacci(i))

#用循环实现
def fibonacci_for(n):
    before = 0
    after = 1
    for i in range(1,n+1):
         tmp = before + after
         before = after
         after = tmp
    return  tmp
for i in range(1,10)
    print(fibonacci_for(i))

6.高阶函数:函数的参数或函数的返回值是函数的函数

def handle(func,*param)
    return func(param)
def my_sum(*param):
    sum = 0
    for v in range(len(param))
        sum += param[i]
    return sum 
print(my_sum(1,2,3,4,5))
#函数的参数还是函数
print(handle(my_sum,1,2,3,4,5,6))

def my_mul(*param)
    mul = 1
    for v in param:
        mul = v
    return mul
print(handle(my_mul,1,2,3,4,5))

7.系统中已经存在的函数
map(func,inteable)
该函数会把inteable中的数据依次传递给func函数处理,最后把处理的结果返回

ef power(x):
    return x * x
result = map(power,[1,2,3,4,5,6])
#for i in result:
 #   print(i)
 result = map(lambda x:x*x,[1,2,3,4,5,6,7])
 print(list(result))

reduce(func,inteable) 函数
累计操作,func函数必须接收两个参数,reduce会把func的运行结果做一个参数,然后从inteable中再取出一个数据当做另一个参数

from functools import reduce
li = [1,2,3]
result = reduce(lambda  x,y:x * y, li)
print(result)

fitter(func,inteabie)
根据函数func 来过滤interable,将interable中的数据传入函数func中,如果函数返回rue,就保留该数据,否则就不保留

li = [1,2,3,4,5,6,9,10,15]
result = list(filter(lambda x:x % 2 ==1,li))
print(result)

sort(inteable,key=None,reverse=False)
对数据进行排序,key可以用来指定排序的规则,值是一个函数,reverse是用来指定排序的顺序,-->升序或降序

li = [1,2,-4,-10,12]
rs = li.sort()    #就地排序
#sorted(li,key=abs)
#print(li)
#list 自带的sort方法会影响原始数据,系统级的sorted函数不会影响原始数据
rs = sorted(li,key=abs,reverse=Ture)
print(rs)

模块

模块就是一个文件,我们在编写程序的时候,可以把功能相似的代码放到一个模快中
导入模块方式:
1.from 开头 from 模块名 import 函数名

  1. import 开头 import 模块名
    可以使用‘as’为模块或函数起一个别名
from food import  make_pizza,make_bun()   
make_pizza()
make_bun()
from food import  make_pizza as mp
from pizza import  make_pizza
mp()
make_pizza()

备注:

def ff():
    '''
    打印test!!
    :return: 
    '''
    print("test!!!!")
    
print(ff.__doc__)
help(ff)

a = (1,[1,2,3],3,4,5)
a[1].append(4)
print(a)

你可能感兴趣的:(2019-05-18)