2018-11-7-内置函数(1)
主要内容
1.range()
2.next()
3.iter()
4.open()
5.input()
6.print()
7.hash()&dir()
8.eval()
9.exec()
10.compile
11.help
12.callable
13.进度条
1.range函数
range(起始位置,终止位置,步长)
一个参数#range(终止位置)
两个参数#range(起始,终止位置)
三个参数#range(起始,终止,步长)
range(5)#[0,4] [0,5)
range(1,5)#[1,4] [1,5)
range(1,10,2)#[1,3,5,7,9]
range(0,10,2)#[0,2,4,6,8]
2.next函数
next(迭代器)是内置函数
__next__ 是迭代器的方法
g.__next__()带双下划线的魔术方法一般情况下不直接用
next(g) 之前所有的__next__都应该替换成next(g)
带双下划线的所有的方法都可能和内置函数有千丝万缕的联系
3.iter(可迭代的)
__iter__
迭代器=可迭代的.__iter__
迭代器=iter(可迭代的 )
4.open函数 open('文件名')#跟着操作系统走的
打开模式 默认是r
编码 默认是操作系统的默认编码
文件打开模式:r w a rb wb ab
r w(文件光标&指针,是乱的)
((为什么不用+)以后工作没有既读又加,只是单独操作的),如果既要读又要写,那么我们需要打开两个文件
编码:utf-8(100%)(写跨平台程序,我们用utf-8)
别人的代码可能是 gbk,这个地方要注意
用mac笔记本,即使我们不指定utf-8,系统已经默认使用了,而windows如果不指定可能会报错,windows默认指定的是GBK
5.input函数
input('字符串数据类型的参数,提醒用户你要输入的内容')
python2和python3的区别:
python2
input() 还原你输入的值的数据类型
raw_input = py3.input
python3
input() 输入的所有内容都是字符串类型
阻塞: 等待某件事情发生,如果不发生一直等着
input的返回值就是用户输入的内容
输入的内容 = input('提示')
小结:input的堵塞,在这里不是一件好事,但是我们现在必须用,但是以后学到更高深的知识后,减少使用
同样是input,我们在python3中的input()和python2的raw_input,我们自己输入的整数数字,都是字符串类型的,而python2中的input输入的整数数字,都是整型的
6.print函数
print(123)
print('abc')
print(123,'abc') #Python在这里用到的是动态传参*args
print(123,'abc','aaa',sep='|')#sep是分隔符号
print(123,'abc','aaa',end='@')
print(123,'abc','aaa',end='@')
print(123,'abc')
总结:a.print里边的sep默认参数是空格,我们可以对其进行赋值
b.print里边的参数end默认参数是"/n",也就是换行,我们可以进行赋值,让其打印到同一行上.
运行结果:
f=open('file','w')
print(123,'abc',file=f)
#print的本质 就是写文件 这个文件是pycharm的屏幕上,默认是屏幕,指定的除外
f.close()
sep就是seprator的简写,也就算是分离器
7.hash函数
# 哈希 可哈希(不可变数据类型) 不可哈希(可变数据类型)
# 哈希是一个算法,导致了字典的快速寻址
# 字符串'asjgkgfk'\元组\数字,复杂的算法 得到一个数字
# 所有的数据要想得到不变的hash值,必须是一个不可变的数据类型
#后期,数据库的快速查找\数据类型的底层\\都会用到了这个机制
#程序 标志你的每一个数据是存储在具体的某一块内存上
7-1.dir函数
特殊的需求,研究或者了解一个新的数据类型,在学习到面向对象之后会介绍新的数据类型
print(dir(int))
print(dir(__builtins__))#查出该变量内置的名字
dir() 函数不带参数时,返回当前范围内的变量、方法和定义的类型列表;带参数时,返回参数的属性、方法列表。
8.eval函数
可以将字符串数据类型的python代码执行,通过拼接字符串的方式来执行不同的代码--简化代码
eval\exec这个函数 不能直接操作文件当中读进来的 网络上传进来 用户输入的
eval('print(1+2+3+4)') # 有返回值
ret = eval('1+2/3*4')
print(ret)
exec('print(1+2+3+4)') # 没有返回值
ret = exec('1+2/3*4')
print(ret)
结果是:
9.exec函数
在同一个根目录下创建userinfo [{'id':1,'name':'alex'}]
f = open('userinfo')
content = f.read()
print(content,type(content))
ret = eval(content) #字符串=>其他数据类型的转换
print(ret,type(ret))
print(ret[0])
从文件中读到的是字符串类型的,经过eval转换可以转换成list类型的
缺陷:我们不能随随便便的读取文件,这里可能碰到黑客的陷阱,尤其是网上的文件
例如:"删除某一个盘下的所有文件夹"
因此eval和exec这两个函数,不能直接操作文件当中读进来的网络上传进来
员工信息表,这个地方可以用到这个小点//思考,左右如果输入的相反怎么办?
#后期还会有一些更好的方法!
def get_info(f):
if eval('33 %s 20'%f): #要判断是真是假,这里有返回值的
print('是符合条件的行')
if '>':
get_info('>')
if '<' :
get_info('<')
exec('for i in range(200):print(i)')#这个不需要判断真假,没有返回值
10.compile 编译函数#锦上添花,节省时间的工具,但是平时还是很少用的//了解这些编译的过程
# 先编译 python -编译-> 字节码(bytes) -解释-> 机器码 0101010100101
# 先整体编译
def func():
yield #就是因为有预编译的过程,所以才会识别这个生成器
compile将字符串类型的代码编译.代码对象能够通过exec语句来执行或者eval()进行求值
(A)code1 = 'for i in range(0,10): print (i)'
compile1 = compile(code1,'','exec')#预编译
exec (compile1)(这行,只需要解释就行了)
exec(code1)#这里的一步等于上边的两步,只不过,上边对了一步预编译的过程(编译加解释)
(B)
code2='1+2+3+4'
compile1 = compile(code2,'','eval')#预编译
eval(compile2)
eval(code2)#原理同(A)
#后期学习爬虫还会用到相关的原理
(C)
code3 = 'name = input("please input your name:")'
compile3 = compile(code3,'','single')
print(name)#这样写会报错
(D)
code3 = 'name = input("please input your name:")'
compile3 = compile(code3,'','single')
exec(compile3)
print(name)#这样可以做到
11.id()函数
查看id
12.help
help() 帮助我们了解python的
方式一
输入help() 进入帮助页面,输入数据类型,帮助我们打印具体的帮助信息
'123'.startswith()
输入q退出帮助
方式二
print(help(str))
print(help('abc'))
help()直接进入下面命令行
13.callable()判断某一个变量是否可调用
def call(arg):
if callable(arg):#如果可调用就调用
arg()
else: #如果不可调用就打印"参数不符合规定"
print('参数不符合规定')
def func():
print('in func')
return 1
func2 = 1234
call(func)
call(func2)
# print(callable(func))
# print(callable(func2))
14.打印进度条
(1)per_str = '\r%s%% : %s' % (10, '*' * 10)#\r光标挪到最前端
per_str = '%s%% : %s' % (10, '*' * 10)
print(per_str,)
小结:在这里上下两行的代码打印的结果是相同的
(2)
import time for i in range(0,101,2): time.sleep(0.1) #每一次在这个地方堵塞0.1s,0.1s结束就结束堵塞 char_num = i//2 #打印多少个'*' per_str = '\r%s%% : %s\n' % (i, '*' * char_num) if i == 100 else '\r%s%% : %s'%(i,'*'*char_num) print(per_str,end='', flush=True)
\r 可以把光标移动到行首但不换行
(2-1)把(2)拆分
import time
for i in range(0,101,2):
time.sleep(0.1) # 每一次在这个地方阻塞0.1,0.1秒结束就结束阻塞
char_num = i//2
if i == 100:
per_str = '\r%s%% : %s\n' % (i, '*' * char_num)
else:
per_str = '\r%s%% : %s' % (i, '*' * char_num)
print(per_str,end = '')
print('下载完成')
(2-2)函数式写法
import time # 导入别人写好的代码
def func():
for i in range(0,101,2):
time.sleep(0.1) # 每一次在这个地方阻塞0.1,0.1秒结束就结束阻塞
char_num = i//2
if i == 100:
per_str = '\r%s%% : %s\n' % (i, '*' * char_num)
else:
per_str = '\r%s%% : %s' % (i, '*' * char_num)
print(per_str,end = '')
func()
print('下载完成')
(2-3)简化版
import time
for i in range(0,101,2):
time.sleep(0.1) # 每一次在这个地方阻塞0.1,0.1秒结束就结束阻塞
char_num = i//2
per_str = '\r%s%% : %s' % (i, '*' * char_num)
print(per_str,end = '')
print('下载完成')
总结:这种写法有个缺陷,就是打印完星号之后,直接打印"下载完成",没有换行
上边两种写法,没有这个毛病
(3)
import time
per_str = '\r%s%% : %s' % (10, '*' * 10)
print(per_str,)
time.sleep(1) #堵塞1s
per_str = '\r%s%% : %s' % (20, '*' * 20)
print(per_str,end='')
要求:
把每一个函数是做什么的整理出来
并且课上的小例子 再敲一遍