2019-05-18

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

** 将参数放到字典中

def d_self_print(**ren):
    print(ren)
d_self_print(lastname='zhang', firstname='san')

元组和字典混合使用

形参顺序:位置参数 ->元组-> 字典

def mix(name, *t, **kw):
    print(name)
    print(t)
    print(kw)


mix('wang', 78, 'dong', 'qin', gender='male')
# mix('wang',78,',gender='male',dong','qin') 则会报错
t = (1, 2, 3, 4, 5)
print(*t)
print(t)


def f(*tt):
    print(tt)

* 有拆开元组,列表的作用

f(*(2, 3, 4, 5, 7))

** 有拆开字典的作用

def ff(**kai):
    print(kai)


# print(**kai)会报错
# print(*kai) 将字典的key值输出
ff(**{'name': 'san', 'age': '66'})

return 返回值

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)
print(avg)
print(sum)


def ff(**kai):
    print(kai)
    # print(**kai)


ff(**{'name': 'san', 'age': '66'})

函数的传参问题

数据分为引用类型和普通类型

l1 = [1, 2, 3, 4]
l2 = l1
l2[1] = 5
print(l1)

l1 l2指向同一块内存 修改l2 l1也被改变 是引用类型
基本数据类型均为普通类型 。数 布尔 字符串型
其他的均是引用类型
普通类型赋值时传的是值
引用类型 赋值时传的是地址

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

a = 2
b = a
b = 5
print(a)


# a的值不受影响 a 和 b 占用不同内存地址
def power(numbers):
    # numbers =[x**2 for x in numbers]
    # 创建数据副本
    # 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)

闭包

def fun():
    print('hello')


print(fun)  # 打印函数所在内存地址
# 函数名本质是函数地址
f = fun
f()
a = 10


def outter():
    # a=10  和nonlocal一起
    def inner():
        # a=a-1 会报错  因为内层函数只能访问外层变量  但不能修改
        # 内层函数访问变量时 会先从自己的内部查找 如果找不到 就会层层向上查找
        global a  # 说明使用的是全局变量,最外层
        a = a - 1
        print(a)
        # nonlocal a
        # python 中变量的作用域是以函数为单位的
        # global修饰变量时 说明使用的时最外层的全局变量
        # nonlocal 修饰变量时 说明使用的是嵌套层函数的变量
        # 闭包的本质是函数嵌套函数 外层函数返回内层函数的地址

    return inner


fo = outter()
fo()
fo()
fo()
fo()

递归 :函数自己调用自己,编写递归或循环时 先考虑出口问题

fibonacci数列

def factorial(n):
    mm = 1
    for num in range(1, n + 1):
        mm *= num
    return mm


def factorial1(n):
    if n == 1:
        return 1
    return n * factorial1(n - 1)


print(factorial(5))
print(factorial1(5))

作业:斐波那契数列 递归实现,循环实现

def fbnq(n):
    if n < 3:
        return 1
    return fbnq(n - 1) + fbnq(n - 2)


for i in range(1, 33):
    print(fbnq(i))

  • 递归
def fibonacci(n):
    if n == 1 or n == 2:
        return 1
    return fibonacci(n - 1) + fibonacci(n - 2)

  • 循环
def fibonacci_for(n):
    before = 0
    after = 1
    for i in range(1, n + 1):
        tmp = before + after
        before = after
        after = tmp  # 可简化为before,after=after,tmp
    return tmp


def fbnq(n):
    a = 1
    b = 1
    for i in range(1, n):
      print(a)
      print(b)
      a = a + b
      b = a + b

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

def handle(func,*param):
    return func(*param)
def my_sum (*param):
    sum1 =0
    for i in range(len(param)-1):
        sum1 +=param[i]
    return sum1
print(my_sum(1,2,3,4,5))

函数的参数还是一个函数

print(handle(my_sum,1,2,3,4,5))
#reduce (func,inteable)函数 累计操作 func函数必须接受两个参数 reduce会把fubc的运行结果做一个参数,再
#从inteable中取一个数据作为另一个参数
from functools import reduce
li =[1,2,3,4,5,6]
result =reduce(lambda  x,y:x*y,li)
print(result)
#filter(func,inteable) 过滤 根据函数func来过滤inteable
#若函数返回TRUE 则保留  否则不保留该数据
li =[1,2,3,4,5,6]
result =list(filter(lambda x:x%2==1),li)
print(result)
#sorted(interable ,k
# key=None ,reverse=False)对数据进行排序 key可用来指定排序的规则 值是一个函数 reverse 用于指定升序还是降序
li =[1,4,68,-56]
#res =li.sort()#就地排序
re =sorted(li,key=abs)
#abs:绝对值排序
#list 自带的sort会影响原始数据 系统级的sorted函数不会影响原始数据
#print(res)
print(re)

打印注释内容

def ff():
    """
    fsff
    :return:
    """
    print('hello')
print(ff.__doc__)

模块

from food import make_bun,make_pizza
#import food 模块名
#from food import *
#from food import  as 别名  避免重名冲突
#模块就是一个文件 在编写程序时 ,可以把功能相似的代码放入一个模块中
#导入模块方法:1.from 模块名 import函数名
#2.import 模块名
#可以使用as为模块或函数起一个别名
make_bun()

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