Python_迭代和函数

问题:Python中那些对象可以遍历循环?
支持迭代协议的对象可以遍历循环,这种对象的特点是内置了__next__方法,该方法可移动指针到下一个关联对象。

一、迭代

判断是否内置next()方法,用iter()

// An highlighted block
list1=[1,2,3]
list1==iter(list1)
False
str1='abc'
str1=iter(str1)
True

怎么把列表变为迭代器
list1=iter(list1)
这样后,list1就可以用next()方法了。

返回list或可迭代对象有什么优劣势
列表支持的操作类型比较多,相对比较灵活,但当数据量太大时,list存储占用很大的内存,而迭代器占用内存较少,但很多方法不支持。

2.函数

优点
最大化代码重用,最小化代码冗余,过程分解
变量作用域
Built-in:python内置的变量
global:函数外层变量
local:函数体内层变量,若要引用外层的用global,当执行完函数时,内存释放,所有的局部变量要被删除。
Enclousure(封装),函数嵌套里的外层函数变量,若内层嵌套变量想用外层的,要用nonlocal
闭包:在内嵌函数中,内部作用域对外部作用域的变量(封装)进行引用,那么内部的内层函数称闭包
内嵌函数:

def func():
    x=100
    def auc():
        x=99
        print(x)
    auc()
    print(x)

99
100

#外层的x=100称为Enclousure(封装)
#auc()为闭包

关键字参数
普通参数叫位置参数,程序员为避免弄错位置参数的位置,引入关键字参数

def eatsomething(name,food):
    print('{} eat {}'.format(name,food))

eatsomething(food='apple',name='xiaoming')

>>>xiaoming eat apple

默认参数
def eatsomething(name=‘orange’,food=‘rice’):
收集参数
不知道函数中到底有几个参数,调用时,除了关键字参数,剩余全部参数*parameter会被打包成元组。

def eatsomething(*parameter,name,food):
    print('{} eat {}'.format(name,food))
    print('收集参数为',parameter)

eatsomething(1,2,'apple',food='apple',name='xiaoming')

>>>xiaoming eat apple
>>>收集参数为 (1, 2, 'apple')

双星是指打包为字典表

def employ_information(**employ):
    print(employ)

employ_information(name='Tom',age=24,salary=20000)


{'name': 'Tom', 'age': 24, 'salary': 20000}

解包

def eatsomething(*parameter,name,food):
    print('{} eat {}'.format(name,food))
    print('收集参数为',parameter)

#解包
a=(1, 2, 'apple')
eatsomething(*a,food='apple',name='xiaoming')

>>>xiaoming eat apple
>>>收集参数为 (1, 2, 'apple')

def employ_information(**employ):
    print(employ)

dict1=dict(name='Tom',age=24,salary=20000)
employ_information(**dict1)

参数传递
a.不可变类型,创建新的副本变量,传递副本给函数,不影响原始值
b.可变类型,传递地址引用,函数内操作可能会影响原始值

#不可变类型(整型,元组,字符串等)
hehe=6
def f(hehe):
    hehe = 2
    print(hehe)
f(hehhe)
print(hehe)

>>>2
>>>6

#可变类型
l1=['apple']
def f1(l1):
    l1[0]=['a']
    print(l1)
f1(l1)
print(l1)

>>>[['a']]
>>>[['a']]

形参实参
形参:函数定义和创建过程小括号里的实数。
实参:函数调用过程中传递进来的参数。

两个工具
1.filter(函数,可迭代数据)

保留关注信息,删掉不想要信息
对可迭代数据的每个元素都作为函数的参数操作,把函数返回值为True的留下。

l=list(range(1,21))
def f(num):
    return num%2==0

result=list(filter(f,l) )
print(result)

[2, 4, 6, 8, 10, 12, 14, 16, 18, 20]

2. map(函数,可迭代数据)函数:映射
对可迭代数据的每个元素都作为函数的参数操作,并写入返回值。

def f(num):
    return num+5

result=list(map(f,l))
print(result)

[6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25]

lambda表达式
创建匿名函数
格式:lambda 参数1…:函数
功能:
代码简洁,不需考虑命名问题,简化代码可读性。

// An highlighted block
f=lambda x:x+5
result=f(10)
print(result)

15

委托(明天查阅资料再修改)
优势,某些情况下简略了修改代码的工作量

def chinese(name):
    print('你的名字是:',name)
hello=chinese #把函数地址委托给hello
hello('Tom')


def hello(function,name):
	function(name)
hello(chinese,'TOM')

用字典表代替if elif举例

用字典表代替if elif
operation={
    'E':english,
    'C':chinese,
    'J':lambda name:print('ahahhaha',name)

}

while True:
    name=input('Please input your name')
    if name == 'stop':
        break
    language = input('Please choose\n E=>english\n C=>Chinese\nJ=>Japanese')
    operation.get(language)(name)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hellobigorange

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值