python--基础知识点梳理(一)数据类型、迭代生成装饰器、函数
可变数据类型和不可变数据类型有哪些?
# 可变数据类型:列表、字典、集合
# 不可变数据类型:数字、元祖、字符串
常见数据结构
# 栈(stack)--先进后出、 队列(queue)-先进先出、链表(LinkedList)
可迭代对象
# 可迭代对象包括:列表、字典、集合、字符串等数据类型。
# 数字类型不可迭代
迭代:我们把python中被for循环取值的操作过程可以理解为迭代
可迭代对象:把可以被for循环遍历的对象也叫可迭代对象。一个具有__iter__()方法的对象是可迭代的,具有__next__()方法的对象是迭代器。(__iter__()方法返回自己,__next__()返回for循环的下一个对象,for循环的本质就是不断调用__next__()方法)
迭代器:访问集合内元素的一种方式。是一个可以记住遍历的位置的对象。迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不能后退,分步骤的完成某个事情
# 迭代器实现斐波那契:
class Fei(object):
def __init__(self,n):
self.n=n
self.num1=0
self.num2=1
self.word_index=0
def __iter__(self):
return self
def __next__(self):
if self.word_index < self.n:
num=self.num1
self.num1,self.num2=self.num2,self.num1+self.num2
self.word_index+=1
return num
else:
raise StopIteration
a=Fei(10)
for i in a:
print(i,end=" ") # 0 1 1 2 3 5 8 13 21 34
判断是否是可迭代对象
#通过isinstance 判断是否是可迭代对象
from collections import Iterable
def test(name,obj):
#返回布尔值 true 或 false
flag = isinstance(obj,Iterable)# isinstance 接收两个参数 第一个是你要判断的对象 第二个是固定的 Iterable
print("%s 是否是可迭代对象%s"%(name,flag))
test("字符串","hello") # True
test("列表",[2,3,5,7,9]) # True
test("数字",10) # False
test("range",range(10)) # True
自定义迭代器
# 自定义可迭代对象
class Userlist(object):
def __init__(self):
self.list_item = []
def append_item(self,name):
self.list_item.append(name)
def func(self):
#获取Userlist对象的迭代器
user_iter = iter(user)
print(next(user_iter))
print(next(user_iter))
print(next(user_iter))
print(next(user_iter))
print(next(user_iter))
# 通过iter 方法返回一个迭代器
def __iter__(self):
stu = StuIterable(self.list_item)
return stu # 返回迭代器
# 自定义迭代器
#一个实现了__iter__方法和__next__方法的对象,就是迭代器。
class StuIterable(object):
def __init__(self,list_item):
self.list_item = list_item
self.current_index = 0 #定义变量,记录下标位置
#重写next 方法返回数据
def __next__(self):
if self.current_index<len(self.list_item):
self.current_index+=1
return self.list_item[self.current_index-1]
# 本身是一个迭代器 所以返回自己就好
def __iter__(self):
return self
#创建Userlist对象
user = Userlist()
user.append_item("小花")
user.append_item("小明")
user.append_item("小红")
user.append_item("小丽")
user.append_item("小强")
user.func()
生成器:生成器是一个特殊的迭代器,内部封装了__iter__()方法。在python中一边循环一边计算的机制称为生成器。比如:列表推导式、yield关键字
# 普通列表推导式
print([i*2 for i in range(10)]) # [0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
# 将列表推导式中的方括号改成小括号就是一个生成器
print((i*2 for i in range(10))) # <generator object <genexpr> at 0x02D65B30>
# yield生成器实现斐波那契: 没有yield 他就是个普通的函数,有了yield 就是一个生成器
def fi(n):
current_index=0
num1 = 0
num2 = 1
while current_index<n:
num = num1
num1,num2 = num2,num1+num2
print("=======1")
yield num
print("=======2")
return "done"
f = fi(10)
print(next(f))
print(next(f))
print(next(f)) """
=======1
0
=======2
=======1
1
=======2
=======1
1
"""
yield和return的区别:
yield相当于 return 返回一个值,并且记住这个返回的位置,下次迭代时,代码从yield的下一条语句开始执行。
return会终止当前函数,且不会记住当前位置,下次执行依然重新开始
闭包:
首先必须是嵌套函数,外层函数返回内层函数,内层函数应用了外层函数的变量。闭包的应用一般可以用作装饰器。
def lazy_sum(*args):
def sum():
ax = 0
for n in args:
ax = ax + n
return ax
return sum #将定义的函数sum()作为结果值返回
f = lazy_sum(1, 3, 5, 7, 9)
print(f()) #
装饰器:
在不改变被装饰函数源代码、被装饰函数的调用方式的情况下。为被装饰函数增加功能的函数,用@符调用。
搜索变量名的优先级:
# LEGB原则:
# 局部作用域local > 嵌套作用域enclosing > 全局作用域global > 内置作用域 built-in
函数:是指将一组语句的集合通过一个名字(函数名)封装起来,要想执行这个函数,只需调用其函数名即可
python函数的三种传参方式
# 位置参数(name)
def stu_register(name,age,course):
# 关键字参数(指定参数名可以不按顺序传参)
stu_register(age=22,name='alex',course="python",)
# 非固定参数(*args必须放在**kwargs前面,*args接收列表类型参数,**kwargs接收字典类型参数)
def stu_register(name,age,*args,**kwargs):
python函数的四种类型
# 1. 无参数,无返回值
# 2. 无参数,有返回值
# 3. 有参数,无返回值
# 4. 有参数,有返回值
递归:函数在内部调用自身本身,这个函数就是递归函数。递归的最大层数是998,根据电脑性能CPU决定。
递归函数的优点是定义简单,逻辑清晰。理论上,所有的递归函数都可以写成循环的方式,但循环的逻辑不如递归清晰。 缺点是过深的调用会导致栈溢出
# 递归实现斐波那契:
def gui(num):
if num > 0:
if num == 1:
return 0
elif num == 2:
return 1
else:
return gui(num-1)+gui(num-2)
else:
return False
for i in range(1,11):
print(gui(i),end=" ") # 0 1 1 2 3 5 8 13 21 34
python四大高阶函数
lambda匿名函数
res = map(lambda x:x**2,[1,5,7,4,8])
for i in res:
print(i)
python--基础知识点梳理(一)数据类型、迭代生成装饰器、函数的更多相关文章
- 最全Python基础知识点梳理
本文主要介绍一些平时经常会用到的python基础知识点,用于加深印象,也算是对于学习这门语言的一个总结与回顾.python的详细语法介绍可以查看官方编程手册,也有一些在线网站可以学习 python语言 ...
- python基础知识7——迭代器,生成器,装饰器
迭代器 1.迭代器 迭代器是访问集合元素的一种方式.迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束.迭代器只能往前不会后退,不过这也没什么,因为人们很少在迭代途中往后退.另外,迭代器 ...
- Python之路第一课Day4--随堂笔记(迭代生成装饰器)
上节回顾: 1.集合 a.关系测试 b.去重 2.文件操作及编码 3.函数 4.局部变量和全局变量 上节回顾 本节课内容: 1.迭代器生成器 2.装饰器 3.json pickle数据序列化 4.软件 ...
- python基础知识点三
内置函数和匿名函数 python 一共有68个内置的函数:它们就是python提供给你直接可以拿来使用的所有函数 内置函数的图:链接 :https://www.processon.com/mindma ...
- python 基础知识点二
深浅copy 1对于赋值运算来说,l1与l2指向的是同一个内存地址,所以他们是完全一样的. l1 = [1,2,3,['barry','alex']] l2 = l1 l1[0] = 111 prin ...
- Python基础知识点总结
Python基础知识与常用数据类型 一.Python概述: 1.1.Python的特点: 1.Python是一门面向对象的语言,在Python中一切皆对象 2.Python是一门解释性语言 3.Pyt ...
- python基础篇_004_装饰器函数
python装饰器函数 1.装饰器函数引导 功能:计算函数执行时长 import time """ 方式一: 函数首位添加时间,差值就是函数执行时间 缺点:每个函数都要加 ...
- python基础(8)-装饰器函数&进阶
从小例子进入装饰器 统计一个函数执行耗时 原始版本 import time # time模块有提供时间相关函数 def do_something(): print("do_something ...
- 《python基础教程(第二版)》学习笔记 函数(第6章)
<python基础教程(第二版)>学习笔记 函数(第6章) 创建函数:def function_name(params): block return values 记录函数:def f ...
随机推荐
- iOS 中使用 webSocket
iOS 中使用 webSocket 是服务器和app之间的一种通信方式 webSocket 实现了服务端推机制(主动向客户端发送消息).新的 web 浏览器全都支持 WebSocket,这使得它的使用 ...
- [Go] 实现面向对象中的继承和覆盖方法
go中的继承是使用结构体嵌套实现的,可以继承父类的方法 覆盖和其他面向对象的语言是一样的,函数名,参数,返回类型一致,就可以覆盖父类的方法 package main import "log& ...
- C# 让你解决方案乱七八糟的DLL放入指定文件夹
嗯,大家的解决方案可能会有许多dll,这样不美观,而且也麻烦. 很多小白都不知道如何将这些dll放到如自己程序的bin文件夹下. 本渣今天来试着将dll复制到指定的文件夹下~ 比如我之前做的一个Win ...
- MATLAB聚类有效性评价指标(外部 成对度量)
MATLAB聚类有效性评价指标(外部 成对度量) 作者:凯鲁嘎吉 - 博客园 http://www.cnblogs.com/kailugaji/ 更多内容,请看:MATLAB: Clustering ...
- 学习java需要英语很好吗?
学习java需要英语很好吗? 编程语言起源于美国,是由英文构成的,其中包括几十个英文的关键字以及几百个英文的函数,除非需要对文本进行处理,否则一般不会出现中文.但是,它们都是孤立的单词,不构成任何语句 ...
- ccf-csp201809题解
目录 ccf-csp201809题解 1. 201809-1 卖菜 题目描述 解析 通过代码 2. 201809-2 买菜 题目描述 解析 通过代码 3.201809-3 元素选择器 题目描述 解析 ...
- xamarin调试android部署到模拟器错误记录:Deployment failed Mono.AndroidTools.InstallFailedException: Unexpected install output: Error: Could not access the Package Manager. Is the system running?
问题记录: 1.生成 ok. 2.昨天也是能部署到模拟器的. 但是今天部署的时候就报了这样的一个错误 Deployment failed Mono.AndroidTools.InstallFailed ...
- 关于scrapy中如何区分是接着发起请求还是开始保存文件
一.区分 根据yield迭代器生成的对象是request对象还是item对象 二.item 1.配置tem对象 在items.py文件中设置类 class MyscrapyItem(scrapy.It ...
- element-ui组件中的input等的change事件中传递自定义参数
以select为例,如果select写在循环里,触发change事件时可能不只需要传递被选中项的值,还要传递index过去,来改变同一循环中的其他标签的状态. 下面这样写是无效的: @change=& ...
- LOG日志溯源取证总结
windows操作系统事件日志 C:\Windows\System32\winevt\Logs\ *( XP C:\Windows\System32) 应用程序日志 App Event.Evtx(Ap ...