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()