常见内置函数(部分)

接上一个博客

函数 作用 用法
help(x) 查看x内部的注释 >>> help(len)
Help on built-in function len in module builtins:

len(obj, /)
Return the number of items in a container.
id(x) 获取x的内存地址 >>> id('a')
2284721012216
int(x) 将x转为整型 >>> int('123')
123
str(x) 将x转为字符串类型 >>> str(123)
'123'
isinstance(x, y) 判断x是否为y类型 >>> isinstance('a', str)
True
pow(x, y) 返回x的y次幂 >>> pow(2, 3)
8
round(x, y) 把x四舍五入,并保留y位小数,y不写则不要小数部分 >>> round(2.45)
2
>>> round(2.45, 1)
2.5
sum(x) 将x全部元素求和 >>> sum([2, 4, 1])
7

可迭代对象

在了解可迭代对象之前,我们要想了解什么叫做迭代。

在执行重复的步骤时,每一次的结果都要依赖上一个的结果计算,这个过程就叫做迭代。

# 迭代过程
n = 0
while n < 5:
print(n)
n += 1

所以,可迭代对象其实简单的来说就是可以放到for循环里进行遍历的数据,像列表、字典、元组、字符串等等

如果在pycharm中想要查看一个数据是否是可迭代对象,我们可以看看这个数据是否可以调用__iter__方法。

可以调用:会提示

不可以调用:不会提示

属于可迭代对象的数据类型:

列表、字典、元组、集合、字符串、文件

不属于可迭代对象的数据类型:

整型、浮点型、布尔值、函数

迭代器对象

一个可迭代对象在调用__iter__方法后返回的结果就是迭代器对象,迭代器对象可以极大的节省存储空间,它只会在需要用的时候才会取出数据。

迭代器对象能调用__iter__方法和__next__方法,所以迭代器对象一定是可迭代对象,但可迭代对象不一定是迭代器对象。

迭代器对象的取值方法

迭代器对象可以用__next__方法取值,每次可以取出一个值,取完了继续取值会报错。

s = 'hello'
# 将可迭代对象变为迭代器对象
res = s.__iter__()
# 调用__next__方法
print(res.__next__()) # 输出:h
print(res.__next__()) # 输出:e
print(res.__next__()) # 输出:l
print(res.__next__()) # 输出:l
print(res.__next__()) # 输出:o
print(res.__next__()) # 报错StopIteration

也可以使用next方法,等价于__next__

s = 'hello'
# 将可迭代对象变为迭代器对象
res = iter(s)
# 调用__next__方法
print(next(res)) # 输出:h
print(next(res)) # 输出:e
print(next(res)) # 输出:l
print(next(res)) # 输出:l
print(next(res)) # 输出:o
print(next(res)) # 报错StopIteration

取值注意事项

"""可迭代对象不要在调用__iter__的同时调用__next__,不然在下一次调用__next__还是只会输出第一个值"""
s = 'hello'
print(s.__iter__().__next__()) # 输出:h
print(s.__iter__().__next__()) # 输出:h
print(s.__iter__().__next__()) # 输出:h """如果一个迭代器对象调用__iter__并不会有任何反应,返回的还是它本身"""
s = 'hello'
res = s.__iter__()
print(res.__iter__().__next__()) # 输出:h
print(res.__iter__().__next__()) # 输出:e
print(res.__next__()) # 输出:l

for循环内部原理

如过此时有一串数据,我们如何不使用for循环将它输出?是不是只能使用while循环输出了?

实现:

s = 'hello'
n = 0
res = iter(s)
while n < len(s):
print(next(res))
n += 1

这时候需要一个变量来判断是否输出完毕,而for循环并不需要额外的变量。

原理

首先我们要了解for循环的语法结构

for 变量名 in 可迭代对象:
循环语句
  1. 在执行for循环时,for循环会先将可迭代对象变为迭代器对象,也就是调用__iter__方法。
  2. 使用迭代器对象的__next__方法依次取值并赋值给变量名
  3. 当值取完后,自动处理报错并退出循环。

前两步的使用while循环表现为:

s = 'hello'
res = s.__iter__()
while True:
print(res.__next__())

第三步的报错该怎么处理,这就是我们接下来要学习的内容。

异常处理

异常就是报错,报错就说明代码有问题,报错的同时程序也会立刻停止运行,异常处理就可以防止报错时程序会停止的问题。

异常信息的组成部分

异常信息有三部分组成。

  • Traceback部分:可以知道报错的位置
  • error部分:可以知道错误类型
  • 报错原因:可以知道为什么会报错

异常的分类

异常主要分为语法异常和逻辑异常两大类。

  • 语法异常:语法结构问题,比如if的语法结构写错,小白经常会犯的错误。
  • 逻辑异常:代码逻辑出现问题,比如字符串类型调用了不属于它的方法。

异常的类型

常见错误类型,只列举部分。

异常类型 原因
NameError 没有声明过的变量被使用了
IndexError 没有此索引
KeyError 没有此键(key)
ValueError 无效参数
ImportError 导入模块错误
SyntaxError 语法错误
TypeError 数据类型错误
IndentationError 缩进错误
AttributeError 调用了错误的方法
StopIteration 迭代器没有更多的值了

异常处理实操

对于代码中可能出现错误的代码,我们可以进行处理让代码不会报错,防止程序停止。

语法结构(括号内的语法可以被省略):

try:
可能会出错的代码
except 错误类型1 (as 变量名): # 错误的信息会赋值给变量名
处理措施
except 错误类型2 (as 变量名): # 错误的信息会赋值给变量名
处理措施
...

如果不知道错误类型,还可以这么写:

try:
可能会出错的代码
except Exception (as 变量名): # 错误的信息会赋值给变量名
处理措施
except Exception (as 变量名): # 错误的信息会赋值给变量名
处理措施
...

实操:

# 案例一:代码会出错
try:
res = int('a')
print(res)
except Exception as e:
print('代码出错啦')
print(e)
"""
运行结果:
代码出错啦
invalid literal for int() with base 10: 'a'
""" # 案例二:代码不会出错
try:
res = int('5')
print(res)
except Exception as e:
print('代码出错啦')
print(e)
"""
运行结果:
5
"""

异常处理原则:不要把全部代码全部写入try中,虽然代码不会报错了,但你的功能也无法实现了,异常处理只适用于检测代码,能不用就不用

异常处理的其他操作

结合else使用:如果try语句里的代码没有异常,则执行else里的代码。

try:
res = int('5')
print(res)
except Exception as e:
print(e)
else:
print('代码正常运行结束了')
"""
运行结果:
5
代码正常运行结束了
"""

结合finally使用:无论try语句里的代码如何,最后都会执行finally里的代码。

# 案例一:代码没有异常
try:
res = int('5')
print(res)
except Exception as e:
print(e)
finally:
print('代码结束了')
"""
运行结果:
5
代码结束了
""" # 案例二:代码有异常
try:
res = int('abc')
print(res)
except Exception as e:
print(e)
finally:
print('代码结束了')
"""
运行结果:
invalid literal for int() with base 10: 'abc'
代码结束了
"""

主动报错:使用raise关键字,强行报错,报错原因可以自行填写。

raise NameError('我就要报错!!!')
# 报错:NameError: 我就要报错!!!

断言(了解即可):使用assert关键字,后面跟判断条件,条件成立则跳过,不成立就会报错。

name = 'jason'
assert isinstance(name, str)
# 无事发生 name = 'jason'
assert isinstance(name, int)
# 报错:AssertionError

for循环本质

了解了异常处理了现在应该明白了for循环的本质了吧!

# for循环
s = 'jason'
for i in s:
print(i) """利用while与异常捕获 实现for循环的功能"""
s = 'jason'
# 1.先转换成迭代器对象
res = s.__iter__()
# 2.迭代取值
while True:
# 3.异常处理
try:
print(res.__next__())
except StopIteration as e:
# 4.结束while循环
break

迭代取值与索引取值的区别

  • 迭代取值

    优点:兼容所有的容器类型。

    缺点:无法重复取值,只能按顺序取值(从左到右),取一个少一个。

  • 索引取值

    优点:可以精确反复取值。

    缺点:只能取有序的容器类型。

python之部分内置函数与迭代器与异常处理的更多相关文章

  1. python学习交流 - 内置函数使用方法和应用举例

    内置函数 python提供了68个内置函数,在使用过程中用户不再需要定义函数来实现内置函数支持的功能.更重要的是内置函数的算法是经过python作者优化的,并且部分是使用c语言实现,通常来说使用内置函 ...

  2. 十五. Python基础(15)--内置函数-1

    十五. Python基础(15)--内置函数-1 1 ● eval(), exec(), compile() 执行字符串数据类型的python代码 检测#import os 'import' in c ...

  3. python 常见的内置函数

    内置函数 接下来,我们就一起来看看python里的内置函数.截止到python版本3.6.2,现在python一共为我们提供了68个内置函数.它们就是python提供给你直接可以拿来使用的所有函数.这 ...

  4. python常用的内置函数哈哈

    python常用的内置函数集合做一个归类用的时候可以查找 abs 返回数字x的绝对值或者x的摸 all (iterable)对于可迭代的对象iterable中所有元素x都有bool(x)为true,就 ...

  5. python常用的内置函数

    python常用的内置函数集合做一个归类用的时候可以查找- abs 返回数字x的绝对值或者x的摸 - all (iterable)对于可迭代的对象iterable中所有元素x都有bool(x)为tru ...

  6. 十六. Python基础(16)--内置函数-2

    十六. Python基础(16)--内置函数-2 1 ● 内置函数format() Convert a value to a "formatted" representation. ...

  7. Python的常用内置函数介绍

    Python的常用内置函数介绍 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.取绝对值(abs) #!/usr/bin/env python #_*_coding:utf-8_ ...

  8. python之路——内置函数和匿名函数

    阅读目录 楔子 内置函数 匿名函数 本章小结 楔子 在讲新知识之前,我们先来复习复习函数的基础知识. 问:函数怎么调用? 函数名() 如果你们这么说...那你们就对了!好了记住这个事儿别给忘记了,咱们 ...

  9. Python进阶(五)----内置函数Ⅱ 和 闭包

    Python进阶(五)----内置函数Ⅱ 和 闭包 一丶内置函数Ⅱ ####内置函数#### 特别重要,反复练习 ###print() 打印输入 #sep 设定分隔符 # end 默认是换行可以打印到 ...

随机推荐

  1. HTML5标签速查

    HTML5标签速查,助你快速了解HTML 5. HTML 5新加入的标签以黑体标识,HTML 5不支持的以斜体标识. 标签 描述 <!--...--> 评论 <!DOCTYPE> ...

  2. JS 实现下拉框回显

    JS 实现下拉框回显 学习内容: 需求 总结: 学习内容: 需求 用 JS 实现下拉框回显 实现代码 <!DOCTYPE html> <html lang="en" ...

  3. 启动两个jboss需要修改的端口号 (两个不能相同)

    standalone-configuration-standalone.xml

  4. title与h1的区别、b与strong的区别、i与em的区别

    strong标签有语义,是起到加重语气的效果,而b标签是没有的,b标签只是一个简单加粗标签.b标签之间的字符都设为粗体,strong标签加强字符的语气都是通过粗体来实现的,而搜索引擎更侧重strong ...

  5. 6.Docker容器底层实现了解与安全机制

    原文地址: 点击直达 0x00 底层实现 我们以 Docker 基础架构来探究Docke底层的核心技术,简单的包括: Linux 上的命名空间(Namespaces) 控制组(Control grou ...

  6. gin框架使用【4.请求参数】

    GET url: http://127.0.0.1:8080/users?id=1&name=卷毛狒狒 package mainimport ( "github.com/gin-go ...

  7. ubuntu16.04安装MATLAB R2017b步骤详解(附完整文件包)

    摘要:介绍在ubuntu16.04中从下载到安装成功的完整步骤.本文给出MATLAB R2017b(Linux系统)的完整安装包百度云盘下载地址,逐步介绍一种简单易行的安装方法,在桌面创建快捷方式,最 ...

  8. Spring 源码(4)在Spring配置文件中自定义标签如何实现?

    Spring 配置文件自定义标签的前置条件 在上一篇文章https://www.cnblogs.com/redwinter/p/16165274.html Spring BeanFactory的创建过 ...

  9. C++ 类成员指针

    C++的类成员指针是一种奇葩的指针. 假设现在我们要表示一个三维的点,现在有两种定义方式: struct point1{ int x, y, z; }; struct point2{ int c[3] ...

  10. linux常用理论(一)

    第一周 1.按系列罗列Linux的发行版,并描述不同发行版之间的联系与区别. Debian Redhat issue 2.安装Centos7.9和ubuntu操作系统,创建一个自己名字的用户名,并可以 ...