目录

今日内容详细

内置函数补充

常见内置函数

help()

查看注释信息

help(len)

id()

返回一串相当于内存地址的数字

print(id('jojo'))

int()

类型转换、机制转换

isinstance()

判断数据类型

print(type('jason') is str)  # 类型判断 不推荐
print(isinstance('jason', str)) # True
print(isinstance('jason', int)) # False

pow()

幂指数

print(pow(10,2))

round()

四舍五入

print(round(11, 1))  # 第二个参数控制需要保留几位小数部分
print(round(11.29, 1))
print(round(11.59, 1))

sum() 求和

print(sum([11,2,2,3,4,3,2]))

迭代器

迭代器即用来迭代取值的工具,迭代其实就是更新换代。每一次对过程的重复称为一次“迭代”,而每一次迭代得到的结果会作为下一次迭代的初始值,单纯的重复并不是迭代

eg:游戏的更新其实就是版本的迭代

# 单纯的循环 不是迭代
import time
while True:
print(123)
time.sleep(0.1) # 属于迭代
n = 1
while True:
print(n)
n += 1 ''' 每一次迭代的过程都需要依赖于上一次的结果''' # 迭代取值
l1 = [11, 22, 33, 44, 55]
n = 0
while n < len(l1):
print(l1[n])
n += 1
'''不仅满足重复,而且以每次重新赋值后的n值作为下一次循环中新的索引进行取值,反复迭代,最终可以取尽列表中的值'''

可迭代对象

什么是可迭代对象?

从语法形式上讲,内置有__iter__方法的对象都可以称之为是可迭代对象,字符串、列表、元组、字典、集合、打开的文件都是可迭代对象

{'name':'jason'}.__iter__
{7,8,9}.__iter__
...
'''数据可以通过点的方式获取出 __iter__ (读作:双下iter方法)'''

哪些数据是可迭代对象?

'''我们可以通过依次列举并尝试调用__iter__方法来得知哪些数据是可迭代对象'''

# 列举所学数据类型
i = 11 # 整型不是
f = 11.11 # 浮点型不是
s = 'jojo' # 字符是
l = [1,2,3,4] # 列表是
d = {'name':'jojo','age':18} # 字典是
t = (1,2,3,4) # 元组是
se = {1,2,3,4,5} # 集合是
b = True # 布尔值不是
f = open() # 文件是
def index():pass # 普通函数不是 """
属于可迭代对象的有
字符串、列表、字典、元组、集合、文件对象
可迭代对象其实就是为了后续迭代取值做准备
提供了不依赖于索引取值的方式
"""

迭代器对象

什么是迭代器对象?

调用 obj.iter() 方法返回的结果就是一个迭代器对象(Iterator)。

迭代器对象是内置有 iternext 方法的对象

'''可迭代对象调用__iter__方法之后生成的结果就是迭代器对象,打开的文件本身就是一个迭代器对象,执行迭代器对象.iter()方法得到的仍然是迭代器本身,而执行迭代器.next()方法就会计算出迭代器中的下一个值。'''

迭代器对象的特征

'''含有 __iter__ 方法和 __next__ 方法'''

如何理解迭代器对象

'''迭代器对象能够极大的节省存储空间'''
# 迭代器对象:只要你需要我就给你,你不需要我就不产生 # 迭代器:Python提供的一种统一的、不依赖于索引的迭代取值方式,只要存在多个“值”,无论序列类型还是非序列类型都可以按照迭代器的方式取值

迭代器对象如何取值

'''调用__next__方法即可 如果取完了则会直接报错!!!'''
s={1,2,3} # 可迭代对象s
i=iter(s) # 本质就是在调用s.__iter__(),返回s的迭代器对象i
print(next(i)) # 1 本质就是在调用i.__next__()
print(next(i)) # 2
print(next(i)) # 3
print(next(i)) # 抛出StopIteration的异常,代表无值可取,迭代结束 '''
ps:开辟了一种不需要索引取值的方式(for循环底层依据的就是迭代器对象)
有了迭代器对象才出现了针对字典和集合的迭代取值操作
'''

迭代器对象补充说明

有些双下方法有简便写法
"""
__方法名__ 等价 方法名()
最为常见的两个是
__iter__ iter()
__next__ next()
""" s = 'jojo' print(s.__iter__())
print(iter(s)) print(s.__len__())
print(len(s))
小Tips
# 有一些可迭代对象本身也是迭代器对象 >>>: 文件对象
# 可迭代对象调用一次__iter__方法编程迭代器对象 ,如果继续调用,结果还是迭代器对象本身
s = 'jojo'
res = s.__iter__()
res1 = s.__iter__().__iter__().__iter__()
print(res, res1)
# <str_iterator object at 0x000001677D8AB278> <str_iterator object at 0x000001677D8AB4A8>
迭代取值的要求
s = 'camellia'

print(s.__iter__().__next__())  # c 每次先产生一个新的迭代器对象然后取值
print(s.__iter__().__next__()) # c 每次先产生一个新的迭代器对象然后取值
print(s.__iter__().__next__()) # c 每次先产生一个新的迭代器对象然后取值
print(s.__iter__().__next__()) # c 每次先产生一个新的迭代器对象然后取值 res = s.__iter__() # 已经变成迭代器对象了
print(res.__iter__().__next__()) # c 之后再调用还是自身
print(res.__iter__().__next__()) # a
print(res.__iter__().__next__()) # m
print(res.__iter__().__next__()) # e

迭代取值与索引取值的对比

索引取值

优势:可以反复获取相同的元素,并且没有固定的方向。
劣势:只能支持有序的容器类型,无序的无法取值兼容性没有迭代取值高。

迭代取值

优势:兼容所有的容器类型
劣势:取值的顺序永远都是从左往右,并且无法重复获取,取完就完了。除非取尽,否则无法获取迭代器的长度。
"""
迭代器里面的东西是固定的,每取一个就会少一个,取完就空了
"""
# 真正底层的迭代取值后续可能很少用,一般都是for循环代替

for循环内部原理

for循环又称为迭代循环,in后可以跟任意可迭代对象

开胃小菜

l1 = [11,22,33,44,55,66,77,88]
'''需求:不依赖于for循环 完成对列表元素的取值''' res = l1.__iter__()
n = 0
while n < len(l1):
print(res.__next__())
n += 1 res = l1.__iter__()
while True:
print(res.__next__())

for循环底层原理

"""
for循环底层原理
for 变量名 in 可迭代对象:
循环体代码
"""
# 1.会将in后面的数据调用__iter__()变成迭代器对象
# 为什么文件对象也可以for循环 ==> 因为本身就是迭代器对象 再次调用不变
# 2.针对产生的迭代器对象依次调用__next__()方法迭代取值
# 3.当值取完之后 会自动处理报错并退出循环

for循环的本质

# 利用while与异常捕获 实现for循环的功能
info = {'name': 'jojo', 'age': 18, 'pwd': 123}
# 1.先转换成迭代器对象
# res = info.__iter__()
res = iter(info)
# 2.迭代取值
while True:
# print(res.__next__())
try:
print(next(res))
except StopIteration as e:
# 结束while循环
break

异常处理

什么是异常?

代码运行出错之后就是异常 异常会导致程序立刻停止

是我们以后在编程过程中需要极力避免的情况(异常的外号>>>:bug)

异常信息的组成部分

Traceback (most recent call last):
File "/Users/jiboyuan/PycharmProjects/day16/05 异常处理.py", line 3, in <module>
name
NameError: name 'name' is not defined
# 1.line关键字所在的一行
用于提示你代码哪一行出错了 点击前面的蓝色字体可以直接定位
'''如果报错的信息很长 一般最后一个才是'''
# 2.NameError错误的类型
代码的报错也可以分为很多类型
# 3.name 'name' is not defined
具体的报错原因(就是解决报错的答案)

异常的分类

语法异常

# 是不被允许的 如果出现了必须立刻改正
eg:if分支结构都不会写...
if 1, while :,...

逻辑异常

# 可以允许的 如果出现了尽快修改即可
eg:代码动态获取到了一个字符串类型的数据但是调用了列表的内置方法
name = 'jason'
print(name.append())
# 改bug其实就是在重新梳理你的思路 """
公司里面写代码的流程
1.程序员写完之后自己先大致测试
2.然后交给专门的测试人员去测试
"""

异常的类型(有很多)

print(name)  # NameError     名字错误
l1 = [11, 22, 33]
print(l1[100]) # IndexError 索引错误
d = {'name':'jason'}
print(d['age']) # KeyError 键错误
int('jason') # ValueError 值错误

异常处理实操

'''有时候针对可能会出错的代码 也可以自己提前写好处理措施'''
正常情况下代码出错 肯定是直接导致程序停止
但是也可以自己通过代码来处理 从而避免程序的停止

基本语法结构

try:
可能会出错的代码
except 错误的类型1 as e: # e指代的就是错误的提示信息
针对性的处理措施
except 错误的类型2 as e: # e指代的就是错误的提示信息
针对性的处理措施
except 错误的类型3 as e: # e指代的就是错误的提示信息
针对性的处理措施

错误类型

很多时候可能自己都不知道会报什么类型的错误
'''万能异常:常见的报错都可以照单全收'''
try:
可能会出错的代码
except Exception as e:
统一的处理措施 ##############################################
异常处理使用准则:
1.被检测的代码越少越好
2.能尽量少用就尽量少用
##############################################

了解异常处理

结合else使用

# 当try检测的代码没有发生异常 正常运行完毕之后执行else的子代码
try:
可能会出错的代码
except Exception as e:
统一的处理措施
else:
可能会出错的代码没有出错 最后走else子代码

结合finally使用

# 无论try检测的代码是否有异常 最后都会执行finally子代码
try:
name
except Exception as e:
print(e)
finally:
无论try检测的代码是否有异常 最后都会执行finally子代码

全部整合到一起使用

try:
name
except Exception as e:
print(e)
else:
print('没报错 好极了')
finally:
print('管你错不错 都执行')

断言

name = 'jojo'
assert isinstance(name,str)

主动报错*

raise NameError('不爽 就要作!!!')
'''由于是主动报错 所以可以非常明确的知道错误的类型'''

python学习-Day16的更多相关文章

  1. python学习 day16 (3月21日)----(正则)

    背景:(对程序的伤害) #__author : 'liuyang' #date : 2019/3/21 0021 上午 10:34 #模块和功能之间的关系 #先有的功能 #正则表达式 #time模块 ...

  2. python学习-day16:函数作用域、匿名函数、函数式编程、map、filter、reduce函数、内置函数r

    一.作用域 作用域在定义函数时就已经固定住了,不会随着调用位置的改变而改变 二.匿名函数 lambda:正常和其他函数进行配合使用.正常无需把匿名函数赋值给一个变量. f=lambda x:x*x p ...

  3. python学习day16 模块(汇总)

    模块(总) 对于range py2,与py3的区别: py2:range() 在内存中立即把所有的值都创建,xrange() 不会再内存中立即创建,而是在循环时边环边创建. py3:range() 不 ...

  4. Python学习day16-模块基础

    <!doctype html>day16 - 博客 figure:last-child { margin-bottom: 0.5rem; } #write ol, #write ul { ...

  5. python学习之旅

    python学习分类 python基础    +- day01——python初始.变量.常量.注释.基础数据类型.输入.if day02——while.字符串格式化.运算符.编码初识 day03—— ...

  6. Python学习--04条件控制与循环结构

    Python学习--04条件控制与循环结构 条件控制 在Python程序中,用if语句实现条件控制. 语法格式: if <条件判断1>: <执行1> elif <条件判断 ...

  7. Python学习--01入门

    Python学习--01入门 Python是一种解释型.面向对象.动态数据类型的高级程序设计语言.和PHP一样,它是后端开发语言. 如果有C语言.PHP语言.JAVA语言等其中一种语言的基础,学习Py ...

  8. Python 学习小结

    python 学习小结 python 简明教程 1.python 文件 #!/etc/bin/python #coding=utf-8 2.main()函数 if __name__ == '__mai ...

  9. Python学习路径及练手项目合集

    Python学习路径及练手项目合集 https://zhuanlan.zhihu.com/p/23561159

随机推荐

  1. 【网鼎杯】jocker--部分代码加壳逆向处理

    Main函数,用户输入flag,长度为24位 Wrong函数进行了简单的异或操作 Omg函数进行异或操作,根据提示来看应该是假check Encrypt无法生成伪代码 发现有加壳以及自修改,下断点动调 ...

  2. python数据分析与挖掘实战————银行分控模型(几种算法模型的比较)

    一.神经网络算法: 1 import pandas as pd 2 from keras.models import Sequential 3 from keras.layers.core impor ...

  3. java常见面试问题总结

    JDK1.7 并发的HashMap为什么会引起死循环? hashmap如何解决hash冲突,为什么hashmap中的链表需要转成红黑树? hashmap什么时候会触发扩容? jdk1.8之前并发操作h ...

  4. Linux 中进程有哪几种状态?在 ps 显示出来的信息中,分别用什么符号表示的?

    (1)不可中断状态:进程处于睡眠状态,但是此刻进程是不可中断的.不可中断,指进程不响应异步信号. (2)暂停状态/跟踪状态:向进程发送一个 SIGSTOP 信号,它就会因响应该信号 而进入 TASK_ ...

  5. Java程序要操作数据库,一定要使用JDBC技术吗?

    <!-- MySQL驱动,连接数据库用,由数据库厂商提供 --> <dependency> <groupId>mysql</groupId> <a ...

  6. Java如何声明变量?JS如何声明变量?

    Java采用强类型变量检查,像C语言一样.所有变量在编译之前必须声明,而且不能使用没有赋值的变量.例如:int x;x=1234;char y='F';其中X=1234说明是一个整数,Y='F'说明是 ...

  7. java -的字符串hei

    字符串的不可变 String 对象是不可变的.查看 JDK 文档你就会发现,String 类中每一个看起来会修改 String 值的方法,实际上都是创建了一个全新的 String 对象,以包含修改后的 ...

  8. 如何给 Spring 容器提供配置元数据?

    这里有三种重要的方法给 Spring 容器提供配置元数据. XML 配置文件. 基于注解的配置. 基于 java 的配置.

  9. keil Uvision4 面向51单片机数据类型属性一览表

  10. String和int、long、double等基本数据类型的转换

    学习目标: 掌握Java的基本数据类型与String的转换 学习内容: 1.转化规则 String 转 基本数据类型 基本数据类型 变量 = 包装类.Parse基本数据类型(String); // c ...