dir()函数有两种形式,如果没有实参,则返回当前本地作用域中的名称列表。如果有实参,它会尝试返回该对象的有效属性列表。如果对象有一个名为 dir() 的方法,那么该方法将被调用,并且必须返回一个属性列表。
dir()函数的语法格式如下:
dir([object])
参数说明:
object: 对象。该参数为可选参数。
返回值:如果没有实参,则返回当前本地作用域中的名称列表。如果有实参,它会尝试返回该对象的有效属性列表。
使用dir()函数输出当前本地作用域中的名称列表,然后导入random和math模块,最后使用dir()函数输出名称列表。代码如下:导入random和math 模块后,dir()函数返回结果列表中多了“math”和“random”2个元素。
print(dir()) # 输出当前本地作用域中的名称列表
import random # 导入random模块
import math # 导入math 模块
print(dir()) # 输出当前本地作用域中的名称列表
将模块名作为参数传递给dir()函数,输出该模块的属性列表。代码如下:
import math
import time
print(dir(math)) # 输出math模块属性名称列表
print(dir(time)) # 输出time模块属性名称列表
将不同类型的对象名作为参数传递给dir()函数,输出该模块的属性列表。代码如下
names = ['张三','李四','王五'] # 定义一个列表
info = {'name':'张三','age':18} # 定义一个字典
print(dir(names)) # 输出列表的属性
print(dir(info)) # 输出字典的属性
创建一个包含__dir__()方法的类,然后将类的实例作为参数传递给dir()函数,代码如下
class Book:
def __dir__(self):
'''定义__dir__函数,返回列表'''
return ['零基础学Python', 'Python即查即用','Python编程锦囊']
my_book = Book() # 实例化Supermarket类
print(dir(my_book)) # 将实例名称作为参数,传递给调用dir()函数
hash()函数的语法格式如下:
hash(object)
参数说明:
使用hash()函数输出不同类型数据的哈希值。代码如下:
int_val = 100
print ("The integer hash value is : " + str(hash(int_val)))
str_val = 'mrsoft'
print ("The string hash value is : " + str(hash(str_val)))
flt_val = 24.56
print ("The float hash value is : " + str(hash(flt_val)))
tuple_val = (1,2,3,4,5)
print ("The tuple hash value is : " + str(hash(tuple_val)))
class Test:
pass
test = Test()
print ("The instance hash value is : " + str(hash(test)))
注意:hash()函数可以应用于数字、字符串和对象,不能直接应用于列表和字典。此外,不同的电脑输出结果不同。
hash()函数实际上是在调用对象的__hash__()方法,所以任何对象都可以重写__hash__()方法。代码如下:
class Student:
def __init__(self, name, age):
self.name = name
self.age = age
def __hash__(self):
print('The hash is:')
return hash((self.name, self.age))
student = Student('Andy',18)
print(hash(student))
hash()函数求解的哈希值是非确定性的,这是因为Python的字符串hash算法并不是直接遍历字符串每个字符去计算hash,而是会有一个secret prefix和一个secret suffix,可以认为相当于是给字符串加盐后做hash,可以规避一些规律输入的情况。
例如,test.py文件的代码如下:运行两次下面的命令,结果并不相同。
print(hash('test'))
可以通过设置环境变量PYTHONHASHSEED来禁用随机化。环境变量是PYTHONHASHSEED,配置为一个正整数,将作为随机种子;配置为0,则secret prefix 和 secret suffix默认清零。
使用如下命令输出哈希值:
PYTHONHASHSEED=0 python test.py
help()函数的语法格式如下:
help([object])
参数说明:
object:可选参数,要查看其帮助信息的对象,如类、函数、模块、数据类型等;
返回值:返回对象的帮助信息。
利用help()函数查看input()函数的帮助信息,示例代码如下:
help(input) # 查看input()函数的信息
利用help()函数查看Python中所有的保留字,示例代码如下:
help("keywords") # 查看所有的关键字
使用help()函数启动帮助系统,查看对象的帮助信息,示例代码如下:
help() # 调用help()函数,不传入参数
使用help()函数查看os模块的帮助信息,示例代码如下:
help('os') # 查看os模块的帮助信息
使用help()函数查看os.path模块中“abspath”函数的帮助信息,示例代码如下:
help("os.path.abspath") # 查看os.path模块中“abspath”函数的帮助信息
使用help()函数查看字符类型的帮助信息,示例代码如下:
help('str') # 查看str数据类型的帮助
使用help()函数查看保留字“if”的帮助信息,示例代码如下:
help("if") # 查看if保留字的帮助信息
使用help()函数查看语法错误异常“SyntaxError”的帮助信息,示例代码如下:
help("SyntaxError") # 查看语法错误“SyntaxError”的帮助信息
使用help()函数查看字符类型中“find”方法的帮助信息,示例代码如下:
help("str.find") # 查看字符类型中的“find”方法的帮助信息
使用help()函数查看当前python中的所有模块,示例代码如下:
help('modules') # 查看当前python中所有的模块
注意:当python中的模块发生改变时,(如模块名称被弃用)将会出现警告信息。
使用help()函数查看Python中提供的帮助主题的列表,示例代码如下:
help("topics") # 查看Python中提供的帮助主题的列表
使用help()函数查看python某一个主题的帮助文档的内容,示例代码如下:
help("UNICODE") # 查看python某一个主题的帮助文档的内容
id()函数的语法格式如下:
id(object)
参数说明:
object: 对象。
返回值:返回对象的内存地址。该值是一个整数,在此对象的生命周期中保证是唯一且恒定的。两个生命期不重叠的对象可能具有相同的 id() 值。
使用id()函数输出不同数据类型的内存地址。代码如下:
n = 5
print('id of number =',id(n))
s = 'mrsoft'
print('id of string =',id(s))
l = [1,2,3,4,5]
print('id of list =',id(l))
d = {'name':'andy'}
print('id of dict =',id(d))
注意:在不同的电脑上,输出结果并不相同。
在Python中经常使用“==”和“is”来比较两个对象是否相等。“==”运算符比较的是两个对象的值是否相等,而“is”运算符比较的是两个对象的id是否相等。下面使用id()函数来说明二者之间的区别。
print('id of 5 =',id(5))
a = 5
print('id of a =',id(a))
b = a
print('id of b =',id(b))
c = 5.0
print('id of c =',id(c))
print(a is b)
print(a is c) # 比较内存地址
print(a == c) # 比较数值
小整数对象池
整数在程序中的使用非常广泛,Python为了优化速度,使用了小整数对象池, 避免为整数频繁申请和销毁内存空间。
Python 对小整数的定义是 [-5, 256] 这些整数对象是提前建立好的,不会被垃圾回收。在一个 Python 的程序中,无论这个整数处于LEGB中的哪个位置,
所有位于这个范围内的整数使用的都是同一个对象。同理,单个字母也是这样的。代码如下:
a = 256
b = 256
c = 257
d = 257
print(a is b)
print(c is d)
说明:上述代码结果是在IDLE解释器中运行。如果以文件方式运行结果都为True,因为解释器在执行时,为减少内存空间,将其视作为同一个对象。
大整数对象池
终端是每次执行一次,所以每次的大整数都重新创建,而在pycharm中,每次运行是所有代码都加载都内存中,属于一个整体,所以此时会有一个大整数对象池,即处于一个代码块的大整数是同一个对象。下面的代码在终端和在Pycharm中结果将会不同。
a = 1000
b = 1000
print(a is b)
在终端输出结果为False,而在Pycharm中输出结果为True。
type()函数有两种形式,当只有一个参数时,用于获取对象的类型;当有多个参数时,用于获取新的类型对象。
第一种:
type(object)
参数说明:
object: 对象。
返回值:返回对象的类型。
第二种:
type(name,bases,dict)
参数说明:
name: 类的名称
bases: 基类的元组
dict: 字典,类内定义的命名空间变量
返回值:返回新的类型对象。
使用type()函数分别输出不同类型对象的数据类型,代码如下:
print(type('mrsoft')) # 输出字符串对象的数据类型
print(type((1,2,3,4,5))) # 输出元组对象的数据类型
print(type([1,2,3,4,5])) # 输出列表对象的数据类型
print(type({'age':18,'gender':'女'})) # 输出字典对象的数据类型
print(type({1,2,3,4,5})) # 输出集合对象的数据类型
isinstance()函数也可以用于判断数据类型的,它与type()函数的区别如下:
1. 相同点:
type()函数和isinstance()函数都能判断对象的数据类型。代码如下:
d = {'name':'andy','age':18}
print(type(d)) # 输出对象的数据类型
print(isinstance(d,dict)) # 检测对象的数据类型是不是字典
print(isinstance(d,str)) # 检测对象的数据类型是不是字符串
2. 不同点:
这两个函数的不同点主要区别在检测某一实例化对象是否属于某一类的时,isinstance()能够判断出子类的实例化对象属于父类,但是type()则不会得出这个结果,它不会认为子类的实例化对象和它父类相同。代码如下:
class Foo():
pass
class Bar(Foo):
pass
print(type(Bar()) == Foo)
print(isinstance(Bar(), Foo))
type()函数有多个参数时,可以用于动态创建一个新的类型对象。这与使用class关键字创建类相似。下面分别使用这两种方式创建类对象。
1. 使用class 关键字创建类
创建一个User类,包含3个函数,代码如下:
class User():
def __init__(self, name, age):
self.name = name
self.age = age
def get_name(self):
print("我的名字是{}".format(self.name))
def get_age(self):
print("我的年龄是{}".format(self.age))
user = User('Andy', 18)
user.get_name()
user.get_age()
2. 使用type()函数动态创建类对象
同样可以使用type()函数来动态的创建类对象,代码如下:
def __init__(self, name, age):
# 实例属性
self.name = name
self.age = age
def get_name(self):
print("我的名字是{}".format(self.name))
def get_age(self):
print("我的年龄是{}".format(self.age))
User = type('User', (object,), {'__init__': __init__, 'get_name': get_name, 'get_age': get_age})
user = User('Andy', 18)
user.get_name()
user.get_age()