本文主要用于记录不太熟悉的知识点
按位取反
按位取反
举例:用4位二进制表示 0100(4)(补码和源码一致)
按位取反 1011(补码)将其转化为源码 1010(补码等于反码加一) 1101(即-5)(符号位不变其他位置取反)
按位取反的小规律:~n = -(n+1) 正负数均适用
print(bin(4)) # 0b100
print(bin(5)) # 0b101
print(bin(~4), ~4) # -0b101 -5
关于String类
-
比较的两个变量,指向的都是地址不可变的类型(str等),那么is,is not 和 ==,!= 是完全等价的。(在python中String类型就是属于这一种)
-
对比的两个变量,指向的是地址可变的类型(list,dict,tuple等),则两者是有区别的
参考大佬的博客之后了解到:java为了提高效率,便于高效的管理这些String对象,设计了 ==String池(String pool)== 用于存放String对象,下面我们来分析一下两种创建String对象的机制。 第一种方式: String string1 = “string”;,这种采用字面值创建String对象的方法,首先检查 String Pool 中是否存在“string”这个对象: 1、如果存在,则不创建任何对象,直接将 String Pool 中的这个 string 对象的地址返回来,赋值给 string1 这个引用,这样 string1 就指向 String Pool 中的 “string” 这个对象; 2、如果 String Pool 中不存在 “string”这个对象,那么就先在 String Pool 中创建一个 “string” 对象,然后将 String Pool 中这个 “string” 对象的地址返回来。 第二种方式: String string2 = new String(“string”);,众所周知new出来的对象是创建在堆内存中的,但是这里因为有 String Pool 的概念,所以略有不同,首先还是检查 String Pool 中是否存在“string”这个对象: 1、如果存在,则不在 String Pool 中再创建 “string”这个对象了,而是在堆内存(heap)中直接创建一个“string”对象,然后将堆中这个 “string”对象的地址返回来,赋值给 string2 引用,这时 string2 指向的是堆中的 “string”对象,注意并不是指向 String Pool; 2、如果 String Pool 不存在 “string”这个对象,则首先在 String Pool 中创建一个“string”对象(为了方便管理嘛),然后再在堆中创建一个“string”对象,返回堆中这个“string”对象的地址,赋值给 string2 这个引用,这便使得 string2 指向了堆中的对应地址。 总结: 使用字面赋值方式创建 String 对象,返回的地址是指向 String Pool 中的,而使用new关键字创建的 String 对象,返回的地址是指向堆内存的。
使用dir方法来查看对象的属性和方法
-
Python 里面万物皆对象(object),整型也不例外,只要是对象,就有相应的属性 (attributes) 和方法(methods)。
-
Python 里面有很多用途广泛的包 (package),用什么你就引进 (import) 什么。包也是对象,也可以用上面提到的dir(decimal) 来看其属性和方法。
b = dir(int)
print(b)
# ['__abs__', '__add__', '__and__', '__bool__', '__ceil__', '__class__',
# '__delattr__', '__dir__', '__divmod__', '__doc__', '__eq__',
# '__float__', '__floor__', '__floordiv__', '__format__', '__ge__',
# '__getattribute__', '__getnewargs__', '__gt__', '__hash__',
# '__index__', '__init__', '__init_subclass__', '__int__', '__invert__',
# '__le__', '__lshift__', '__lt__', '__mod__', '__mul__', '__ne__',
# '__neg__', '__new__', '__or__', '__pos__', '__pow__', '__radd__',
# '__rand__', '__rdivmod__', '__reduce__', '__reduce_ex__', '__repr__',
# '__rfloordiv__', '__rlshift__', '__rmod__', '__rmul__', '__ror__',
# '__round__', '__rpow__', '__rrshift__', '__rshift__', '__rsub__',
# '__rtruediv__', '__rxor__', '__setattr__', '__sizeof__', '__str__',
# '__sub__', '__subclasshook__', '__truediv__', '__trunc__', '__xor__',
# 'bit_length', 'conjugate', 'denominator', 'from_bytes', 'imag',
# 'numerator', 'real', 'to_bytes']
print() 函数
print(*objects, sep=' ', end='\n', file=sys.stdout, flush=False)
- 将对象以字符串表示的方式格式化输出到流文件对象file里。其中所有非关键字参数都按
str()
方式进行转换为字符串输出; - 关键字参数
sep
是实现分隔符,比如多个参数输出时想要输出中间的分隔字符; - 关键字参数
end
是输出结束时的字符,默认是换行符\n
; - 关键字参数
file
是定义流输出的文件,可以是标准的系统输出sys.stdout
,也可以重定义为别的文件; - 关键字参数
flush
是立即把内容输出到流文件,不作缓存。
shoplist = ['apple', 'mango', 'carrot', 'banana']
print("This is printed with 'sep='&''.")
for item in shoplist:
print(item, 'another string', sep='&')
for item in shoplist:
print(item, 'another string', sep=' ')
"""
This is printed with 'sep='&''.
apple&another string
mango&another string
carrot&another string
banana&another string
apple another string
mango another string
carrot another string
banana another string
"""
Python之位运算实现整数集合
Python是一种对缩进十分敏感的语言
注意:
- 不应该使用空格或Tab缩进的地方使用了空格或Tab。
- 不同级别的代码没有缩进。
- 缩进量不同。
- Tab和空格的混用。
while - else 循环与for - else 循环
-
当
for
循环正常执行完的情况下,执行else
输出,如果for
循环中执行了跳出循环的语句,比如break
,将不执行else
代码块的内容,与while - else
语句一样。 -
当for循环正常执行完的情况下,执行else输出,如果for循环中执行了跳出循环的语句,比如 break,将不执行else代码块的内容,与while - else语句一样。
enumerate()函数
enumerate(sequence, [start=0])
- sequence:一个序列、迭代器或其他支持迭代对象。
- start:下标起始位置。
- 返回 enumerate(枚举) 对象。
seasons = ['Spring', 'Summer', 'Fall', 'Winter']
lst = list(enumerate(seasons))
print(lst)
# [(0, 'Spring'), (1, 'Summer'), (2, 'Fall'), (3, 'Winter')]
lst = list(enumerate(seasons, start=1)) # 下标从 1 开始
print(lst)
# [(1, 'Spring'), (2, 'Summer'), (3, 'Fall'), (4, 'Winter')]
enumerate()
与 for 循环的结合使用。
for i, a in enumerate(A)
do something with a
用 enumerate(A)
不仅返回了 A
中的元素,还顺便给该元素一个索引值 (默认从 0 开始)。此外,用 enumerate(A, j)
还可以确定索引起始值为 j
。
languages = ['Python', 'R', 'Matlab', 'C++']
for language in languages:
print('I love', language)
print('Done!')
# I love Python
# I love R
# I love Matlab
# I love C++
# Done!
for i, language in enumerate(languages, 2):
print(i, 'I love', language)
print('Done!')
# 2 I love Python
# 3 I love R
# 4 I love Matlab
# 5 I love C++
# Done!
Reference
关于String类型的部分思考和理解参考了博客https://blog.csdn.net/weixin_29791447/article/details/114171637
关于Python之位运算实现整数集合
https://blog.csdn.net/water19111213/article/details/107510844?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522162645909016780357244637%2522%252C%2522scm%2522%253A%252220140713.130102334…%2522%257D&request_id=162645909016780357244637&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allbaidu_landing_v2~default-3-107510844.first_rank_v2_pc_rank_v29&utm_term=%E5%88%A9%E7%94%A8%E4%BD%8D%E8%BF%90%E7%AE%97%E5%AE%9E%E7%8E%B0%E6%95%B4%E6%95%B0%E9%9B%86%E5%90%88&spm=1018.2226.3001.4187