【Python之路——基础回顾90列】

2023-11-03

基础

1 求绝对值

求绝对值或复数的模

>>> abs(-6)
6

2 元素都为真

接受一个迭代器,如果迭代器的 所有元素 都为真,那么返回 True ,否则返回 False

>>> all([0,1,2,3])
False
>>> all([1,2,3])
True

3 元素至少一个为真

接受一个迭代器,如果迭代器里 至少有一个 元素为真,那么返回 True ,否则返回 False

>>> any([0,0,0])
False
>>> any([0,0,1])                                              True

4 ascii展示对象

调用对象的repr() 方法,获得该方法的返回值

class Student:
    def __init__(self, id, name):
        self.id = id
        self.name = name

    def __repr__(self):
        return f'id={self.id},name={self.name}'


if __name__ == '__main__':
    Xiaoming = Student(1, '小明')
    print(Xiaoming)
id=1,name=小明

5 十转二

将 十进制 转换为 二进制

>>> bin(10)
'0b1010'

6 十转八

将 十进制 转换为 八进制

>>> oct(10)
'0o12'

7 十转十六

将 十进制 转换为 十六进制

>>> hex(15)
'0xf'

8 判断是真是假

测试一个对象是True, 还是False

# 当数组为空时,其值为假
>>> bool([])
False
>>> bool([0])
>True
>>>> bool([1])
>True

9 字符串转字节

将一个 字符串 转换成 字节 类型

>>> s = 'apple'
>>> bytes(s,encoding='utf-8')
b'apple'

10 转为字符串

将 字符类型 、 数值类型 等转换为 字符串 类型

>>> i = 100
>>> str(i)
'100'

11 是否可调用

判断对象是否可被调用,能被调用的对象就是一个callable对象,比如函数str, int等都是可被调用的,但是例子4中xiaoming实例是不可被调用的:

class Student:
    def __init__(self, id, name):
        self.id = id
        self.name = name

    def __repr__(self):
        return f'id={self.id},name={self.name}'


if __name__ == '__main__':
    Xiaoming = Student(1, '小明')
    print(callable(int))
    print(callable(str))
    print(callable(Xiaoming))
True
True
False

如果想让xiaoming能被调用 xiaoming(), 需要重写Student类的__call__方法:

class Student:
    def __init__(self, id, name):
        self.id = id
        self.name = name

    def __repr__(self):
        return f'id={self.id},name={self.name}'

    def __call__(self, *args, **kwargs):
        print('I can be called')
        print('My name is 小明')


if __name__ == '__main__':
    Xiaoming = Student(1, '小明')
    print(callable(int))
    print(callable(str))
    print(callable(Xiaoming))
    Xiaoming()
True
True
True
I can be called
My name is 小明

12 十转ASCII

查看十进制整数对应的ASCII字符

>>> chr(65)
'A'

13 ASCII转十

查看某个ASCII字符对应的十进制数

>>> ord('A')
65

14 类方法

classmethod装饰器对应的函数不需要实例化,不需要self参数,但第一个参数需要是表示自身类的 cls 参数,可以来调用类的属性,类的方法,实例化对象等。

class Student:
    def __init__(self, id, name):
        self.id = id
        self.name = name

    def __repr__(self):
        return f'id={self.id},name={self.name}'

    @classmethod
    def cm(cls):
        print(cls)


if __name__ == '__main__':
    Xiaoming = Student(1, '小明')
    Xiaoming.cm()
<class '__main__.Student'>

15 执行字符串表示的代码

将字符串编译成python能识别或可执行的代码,也可以将文字读成字符串再编译。

def main1():
    s = 'print("Hello!World1!")'
    r = compile(s, '<string>', 'exec')
    exec(r)
    

def main2():
    s = 'print("Hello!World2!")'
    eval(s)


if __name__ == '__main__':
    main1()
    main2()
Hello!World1!
Hello!World2!

16 创建复数

创建一个复数

>>> complex(1,2)
(1+2j)

17 动态删除属性

删除对象的属性

class Student:
    def __init__(self, id, name):
        self.id = id
        self.name = name

    def __repr__(self):
        return f'id={self.id},name={self.name}'


if __name__ == '__main__':
    xiaoming = Student(1, '小明')
    # 查看对象是否存在此属性
    print(hasattr(xiaoming, 'id'))
    # 动态删除此属性
    delattr(xiaoming, 'id')
    print(hasattr(xiaoming, 'id'))
True
False

18 转为字典

创建数据字典

>>> dict()
{}

>>> dict(a='a',b='b')
{'a': 'a', 'b': 'b'}

>>> dict(zip(['a','b'],[1,2]))
{'a': 1, 'b': 2}
# 元组列表转字典
>>> dict([('a',1),('b',2)]
{'a': 1, 'b': 2}

19 一键查看对象所有方法

不带参数时返回当前范围内的变量、方法和定义的类型列表;带参数时返回参数的属性,方法列表。

>>> dir(xiaoming)
['__class__','__delattr__','__dict__','__dir__','__doc__','__eq__','__format__','__ge__','__getattribute__','__gt__','__hash__','__init__','__init_subclass__','__le__','__lt__','__module__','__ne__','__new__','__reduce__','__reduce_ex__','__repr__','__setattr__','__sizeof__','__str__','__subclasshook__','__weakref__','name']

20 取商和余数

分别取商和余数

>>> divmod(10,3)
(3, 1)

21枚举对象

返回一个可以枚举的对象,该对象的next()方法将返回一个元组。

myList = ['a', 'b', 'c','d']
for i, v in enumerate(myList, 1):
    print(i, v)
2 a
3 b
4 c
5 d

22 计算表达式

将字符串str 当成有效的表达式来求值并返回计算结果取出字符串中内容

>>> s = "1 + 3 +5"
>>> eval(s)
9

23 查看变量所占字节数

>>> import sys
>>> a = {'a':1,'b':2.0}
>>> sys.getsizeof(a)
240
# 占用240个字节

24 过滤器

在函数中设定过滤条件,迭代元素,保留返回值为True的元素:

>>> fil = filter(lambda x: x>10,)

25 转为浮点类型

将一个整数或数值型字符串转换为浮点数

>>> float(3)
3.0

如果不能转化为浮点数,则会报ValueError

26 字符串格式化

格式化输出字符串,format(value, format_spec)实质上是调用了value的format(format_spec)方法。

>>> print('i am {0},age{i}'.format('tom',18))
i am tom,age 18
数值 表达式 输出结果 说明
3.1415926 {:.2f} 3.14 保留小数点后两位
3.1415926 {:+.2f} +3.14 带符号保留小数点后两位
-1 {:+.2f} -1.00 带符号保留小数点后两位
2.71828 {:.0f} 3 不带小数(四舍五入)
5 {:0>2d} 05 数字补零 (右对齐,0填充左边, 宽度为2)
5 {:x<4d} 5xxx 数字补x (左对齐,x填充右边, 宽度为4)
1000000 {:,} 1,000,000 以逗号分隔的数字格式
0.25 {:.2%} 25.00% 百分比格式
1000000 {:.2e} 1.00e+06 指数记法
18 {:>10d} ’ 18’ 右对齐 (默认, 宽度为10)
18 {:<10d} '18 ’ 左对齐 (宽度为10)
18 {:^10d} ’ 18 ’ 中间对齐

27 冻结集合

创建一个不可修改的集合

>>> frozenset([1,2,3])

因为不可修改,所以没有像set那样的add和pop方法

28 动态获取对象属性

获取对象的属性

class Student:
    def __init__(self, id, name):
        self.id = id
        self.name = name

    def __repr__(self):
        return f'id={self.id},name={self.name}'


if __name__ == '__main__':
    xiaoming = Student(1, '小明')
    print(getattr(xiaoming, 'name'))
小明

29 对象是否有这个属性

class Student:
    def __init__(self, id, name):
        self.id = id
        self.name = name

    def __repr__(self):
        return f'id={self.id},name={self.name}'


if __name__ == '__main__':
    xiaoming = Student(1, '小明')
    print(hasattr(xiaoming, 'name'))
    print(hasattr(xiaoming, 'age'))
True
False

30 返回对象的哈希值

返回对象的哈希值,值得注意的是自定义的实例都是可哈希的,list, dict, set等可变对象都是不可哈希的(unhashable)

class Student:
    def __init__(self, id, name):
        self.id = id
        self.name = name

    def __repr__(self):
        return f'id={self.id},name={self.name}'


if __name__ == '__main__':
    xiaoming = Student(1, '小明')
    print(hash(xiaoming))
1133299

31 一键帮助

返回对象的帮助文档

>>> help(xiaoming)
Help on Student in module __main__ object:

class Student(builtins.object)
 |  Student(id, name)
 |  
 |  Methods defined here:
 |  
 |  __init__(self, id, name)
 |      Initialize self.  See help(type(self)) for accurate signature.
 |  
 |  __repr__(self)
 |      Return repr(self).
 |  
 |  ----------------------------------------------------------------------
 |  Data descriptors defined here:
 |  
 |  __dict__
 |      dictionary for instance variables (if defined)
 |  
 |  __weakref__
 |      list of weak references to the object (if defined)

None

32 对象门牌号

返回对象内存地址

>>> id(xiaoming)
98234208

33 获取用户输入

获取用户输入内容

>>> input()
hello
'hello'

34 转为整型

int(x, base =10) , x可能为字符串或数值,将x 转换为一个普通整数。如果参数是字符串,那么它可能包含符号和小数点。如果超出了普通整数的表示范围,一个长整数被返回。

>>> int('100')
100
# 将字符串的数看做2进制
>>> int('100',2)
4

35 isinstance

判断object是否为类classinfo的实例,是返回true

>>> isinstance(xiaoming,Student)
True

父子关系鉴定

>>> classundergraduate(Student):
>>>     defstudyClass(self):
>>>         pass
>>>     defattendActivity(self):
>>>         pass
>>> issubclass(undergraduate,Student)
True
>>> issubclass(object,Student)
False
>>> issubclass(Student,object)
True

如果class是classinfo元组中某个元素的子类,也会返回True

>>> issubclass(int,(int,float))
True

37 创建迭代器类型

使用iter(obj, sentinel), 返回一个可迭代对象, sentinel可省略(一旦迭代到此元素,立即终止)

def main():
    lst = [1, 2, 3, 4]
    for i in iter(lst):
        print(i)


class TseIter:
    def __init__(self):
        self.l = [1, 2, 3, 4, 5]
        self.i = iter(self.l)

    def __call__(self, *args, **kwargs):
        item = next(self.i)
        print('__call__ is called,next iter is', item)
        return item

    def __iter__(self):
        print('__iter__ is called:')
        return iter(self.l)


if __name__ == '__main__':
    main()

    t = TseIter()
    t()  # 因为实现了__call__可以直接调用
    t()
    t()
    for e in TseIter():  # 因为实现了__iter__方法,所以t能被迭代
        print(e)
1
2
3
4
__call__ is called,next iter is 1
__call__ is called,next iter is 2
__call__ is called,next iter is 3
__iter__ is called:
1
2
3
4
5

38 所有对象之根

object 是所有类的基类

>>> o = object()
>>> type(o)
object

39 打开文件

返回文件对象

f = open(r'39.txt', 'r', encoding='utf-8')
print(f.read())
f.close()
hello!world!

mode取值表:

字符 意义
‘r’ 读取(默认)
‘w’ 写入,并先截断文件
‘x’ 排它性创建,如果文件已存在则失败
‘a’ 写入,如果文件存在则在末尾追加
‘b’ 二进制模式
‘t’ 文本模式(默认)
‘+’ 打开用于更新(读取与写入)

40 次幂

base为底的exp次幂,如果mod给出,取余

# 2**3
>>> pow(3, 2)
9
# 2**3%3 
>>> pow(3, 2, 4)
1

41 打印

>>> lst = [1,3,5]
>>> print(lst)
[1, 3, 5]
>>> print(f'lst: {lst}')
lst: [1, 3, 5]
>>> print('lst:{}'.format(lst))
lst:[1, 3, 5]
>>> print('lst:',lst)
lst: [1, 3, 5]

42 创建属性的两种方式

返回 property 属性,典型的用法:

class C:
    def __init__(self):
        self._x = None

    def getx(self):
        return self._x

    def setx(self, value):
        self._x = value

    def delx(self):
        del self._x

    # 使用property类创建 property 属性
    x = property(getx, setx, delx, "I'm the 'x' property.")

使用python装饰器,实现与上完全一样的效果代码:

class C:
    def __init__(self):
        self._x = None

    @property
    def x(self):
        return self._x

    @x.setter
    def x(self, value):
        self._x = value

    @x.deleter
    def x(self):
        del self._x

43 创建range序列

  1. range(stop)
  2. range(start, stop[,step])
>>> print(range(11))
range(0,11)

44 反向迭代器

>>> rev = reversed([1,2,3,4])
>>> for i in rev:
>>>     print(i)
4
3
2
1

45 四舍五入

四舍五入,ndigits代表小数点后保留几位:

>>> round(10.0252222, 3)
10.025
>>> round(10.0252222, 2)
10.03

46 转为集合类型

返回一个set对象,集合内不允许有重复元素:

>>> a = [1,4,2,3,1]
>>> set(a)
{1, 2, 3, 4}

47 转为切片对象

class slice(start, stop[, step])
返回一个表示由 range(start, stop, step) 所指定索引集的 slice对象,它让代码可读性、可维护性变好。

>>> a = [1,2,3,4,5,6,7,8,9]
>>> slice_meaning = slice(0,6,2)
>>> print(a[slice_meaning])
[1, 3, 5] 

48 拿来就用的排序函数

排序:

>>> a = [1,4,2,3,1]
>>> b = sorted(a,reverse=True)
>>> b
[4, 3, 2, 1, 1]

>>> a = [{'name':'xiaoming','age':20,'gender':'male'},{'name':'xiaohong','age':18,'gender':'female'}]
# 根据性年龄排序
>>> b = sorted(a,key=lambda x: x['age'],reverse=False)
>>> b
[{'name': 'xiaohong', 'age': 18, 'gender': 'female'}, {'name': 'xiaoming', 'age': 20, 'gender': 'male'}]

49 求和函数

求和:

>>> a = [1,2,3,4,5]
>>> sum(a)
11
>>> sum(a,10)  # 求和的初始值为10
21

50 转元组

tuple() 将对象转为一个不可变的序列类型

>>> my_list = [1,2,3]
>>> tuple(my_list)
(1, 2, 3)

51 查看对象类型

classtype(name, bases, dict)
传入一个参数时,返回object的类型:

>>> type(xiaoming)
__main__.Student
>>> type(tuple())
tuple

52 聚合迭代器

创建一个聚合了来自每个可迭代对象中的元素的迭代器:

>>> x = [1,2,3]
>>> y = [4,5,6]
>>> list(zip(x,y))
[(1, 4), (2, 5), (3, 6)]

>>> a = range(5)
>>> b = list('abcde')
>>> [str(y) + str(x) for x,y in zip(a, b)]
['a0', 'b1', 'c2', 'd3', 'e4']

53 nonlocal用于内嵌函数中

关键词nonlocal常用于函数嵌套中,声明变量i为非局部变量;如果不声明,i+=1表明i为函数wrapper内的局部变量,因为在i+=1引用(reference)时,i未被声明,所以会报unreferencedvariable的错误。

def out_def():
    i = 0
    j = 0

    def in_def():
        i = 1
        nonlocal j
        j = 1

    in_def()

    print('i=', i)
    print('j=', j)


out_def()
i= 0
j= 1

54 global 声明全局变量

先回答为什么要有global,一个变量被多个函数引用,想让全局变量被所有函数共享。

def out_def():
    global i
    i = 1
    print('i=', i)

    def in_def():
        global i
        i = 2
        print('i=', i)

    in_def()


i = 0
print('i=', i)
out_def()

55 链式比较

i = 3
print(1<i<3)  # False
print(1<i<= 3)  # True

56 不用else和if实现计算器

from operator import *


def calculator(a, b, k):
    return {
        '+': add,
        '-': sub,
        '*': mul,
        '/': truediv,
        '**': pow
    }[k](a, b)


print(calculator(1, 2, '+'))
print(calculator(1, 2, '*'))
print(calculator(2, 3, '**'))
3
2
8

57 链式操作

from operator import (add, sub)


def add_or_sun(a, b, oper):
    return (add if oper == '+' else sub)(a, b)


print(add_or_sun(1, 2, '+'))
3

交换元素

def swap(a, b):
    return b, a


x = 1
y = 100
x, y = swap(x, y)
print(x, y)
# 或x,y = y,x
100 1

59 去最求平均

def avg(my_list):
    # 排序
    my_list.sort()
    # 去掉最高最低
    my_list = my_list[1:len(my_list) - 1]
    # 求平均
    return sum(my_list)/len(my_list)


myList = [1, 2.3, 45, 2, 34, 12, 15, 13.2, 34, 11]
print(avg(myList))
15.4375

60 打印99乘法表

打印出如下格式的乘法表

for i in range(1, 10):
    for j in range(1, i + 1):
        print(f'{i:<d} * {j:<d} = {i * j:<2d}', end='\t')
    print()
1 * 1 = 1 	
2 * 1 = 2 	2 * 2 = 4 	
3 * 1 = 3 	3 * 2 = 6 	3 * 3 = 9 	
4 * 1 = 4 	4 * 2 = 8 	4 * 3 = 12	4 * 4 = 16	
5 * 1 = 5 	5 * 2 = 10	5 * 3 = 15	5 * 4 = 20	5 * 5 = 25	
6 * 1 = 6 	6 * 2 = 12	6 * 3 = 18	6 * 4 = 24	6 * 5 = 30	6 * 6 = 36	
7 * 1 = 7 	7 * 2 = 14	7 * 3 = 21	7 * 4 = 28	7 * 5 = 35	7 * 6 = 42	7 * 7 = 49	
8 * 1 = 8 	8 * 2 = 16	8 * 3 = 24	8 * 4 = 32	8 * 5 = 40	8 * 6 = 48	8 * 7 = 56	8 * 8 = 64	
9 * 1 = 9 	9 * 2 = 18	9 * 3 = 27	9 * 4 = 36	9 * 5 = 45	9 * 6 = 54	9 * 7 = 63	9 * 8 = 72	9 * 9 = 81	

61 二维转一维数组

from numpy import *

a = array([[1, 2], [3, 4], [5, 6]])
print(a)
print()
print(a.flatten())
[[1 2]
 [3 4]
 [5 6]]

[1 2 3 4 5 6]

62 列表等分

from math import ceil


def divide(lst, size):
    if size <= 0:
        return [lst]
    return [lst[i * size:(i + 1) * size] for i in range(0, ceil(len(lst) / size))]


myList = [1, 2, 3, 4, 5, 6, 7, 8, 9]
r = divide(myList, 3)  # 分为3等份
print(r)
[[1, 2, 3], [4, 5, 6], [7, 8, 9]]

63 列表压缩

def filter_false(lst):
    return list(filter(bool, lst))


r = filter_false([None, 0, False, '', [], 'ok', [1, 2]])
print(r)
['ok', [1, 2]]

64 最长列表

def max_length(*lst):
    return max(*lst, key=lambda v: len(v))


myList1 = [1, 2, 3]
myList2 = [2, 3, 4, 5, 6, 7]
myList3 = [1, 2, 3, 4, 5]
r = max_length(myList1, myList2, myList3)
print(r)
[2, 3, 4, 5, 6, 7]

65 求众数

def topl(lst):
    return max(lst, default='列表为空', key=lambda v: lst.count(v))


myList = [1, 2, 3, 4, 5, 6, 4, 5, 7, 8, 4, 2, 3, 5, 7, 8, 4, 2, 4, 6, 7, ]
r = topl(myList)
print(r)
4

66 列表最大

def max_list(*lst):
    return max(max(*lst, key=lambda v: max(v)))


r = max_list(([2, 3, 4], [4, 5, 6], [3, 2, 1]))
print(r)
6

67 列表查重

def has_duplicates(lst):
    return len(lst) == len(set(lst))


x = [1, 2, 3, 4, 5, 6]
y = [1, 2, 3, 4, 5, 6, 5, ]
print(has_duplicates(x))
print(has_duplicates(y))
True
False

68 列表翻转

def reverse(lst):
    return lst[::-1]


myList1 = [1, 2, 3, 4, 5, 6]
myList2 = [7, 8, 9, 10, 11]
myList2.sort(reverse=True)

print(reverse(myList1))
print(myList2)
[6, 5, 4, 3, 2, 1]
[11, 10, 9, 8, 7]

69 浮点数等差数列

def rang(start, stop, n):
    start, stop, n = float('%.2f' % start), float('%.2f' % stop), float('%d' % n)
    step = (stop - start) / n
    lst = [start]
    while n > 0:
        start, n = start + step, n - 1
        lst.append((round((start), 2)))
    return lst


print(rang(1, 9, 10))
[1.0, 1.8, 2.6, 3.4, 4.2, 5.0, 5.8, 6.6, 7.4, 8.2, 9.0]

70 按条件分组

def bif_by(lst, f):
    return [[x for x in lst if f(x)], [x for x in lst if not f(x)]]


records = [25, 89, 31, 34, 89, 100, 80, 34, 68]
print(bif_by(records, lambda x: x < 80))
[[25, 31, 34, 34, 68], [89, 89, 100, 80]]

71 map实现向量运算

#多序列运算函数—map(function,iterabel,iterable2)
lst1=[1,2,3,4,5,6]
lst2=[3,4,5,6,3,2]
list(map(lambdax,y:x*y+1,lst1,lst2))
### [4, 9, 16, 25, 16, 13]

72 值最大的字典

def max_pairs(dic):
    if len(dic) == 0:
        return dic
    max_val = max(map(lambda v: v[1], dic.items()))
    return [item for item in dic.items() if item[1] == max_val]


r = max_pairs({'a': -10, 'b': 5, 'c': 3, 'd': 5})
print(r)  # [('b', 5), ('d', 5)]

73 合并两个字典

def merge_dic(dict1, dict2):
    return {**dict1, **dict2}


dic1 = {'a': 1, 'b': 2}
dic2 = {'c': 3}
print(merge_dic(dic1, dic2))
# {'a': 1, 'b': 2, 'c': 3}
dic1.update(dic2)
print(dic1)
# {'a': 1, 'b': 2, 'c': 3}

74 topn 字典

from heapq import nlargest


# 返回字典d前n个最大值对应的键
def topn_dict(d, n):
    return nlargest(n, d, key=lambda k: d[k])


topn_dict({'a': 10, 'b': 8, 'c': 9, 'd': 10}, 3)
# ['a', 'd', 'c']

75 异位词

from collections import Counter


# 检查两个字符串是否相同字母异序词,简称:互为变位词
def anagram(str1, str2):
    return Counter(str1) == Counter(str2)


anagram('eleven+two', 'twelve+one')  # True 这是一对神器的变位词
anagram('eleven', 'twelve')  # False

逻辑上合并字典

(1)两种合并字典方法这是一般的字典合并写法

dic1 = {'x': 1, 'y': 2 }
dic2 = {'y': 3, 'z': 4 }
merged1 = {**dic1, **dic2}
# {'x': 1, 'y': 3, 'z': 4}

修改merged[‘x’]=10,dic1中的x值不变,merged是重新生成的一个新字典。

(2)但是,ChainMap却不同,它在内部创建了一个容纳这些字典的列表。因此使用ChainMap合并字典,修改merged[‘x’]=10后,dic1中的x值改变,如下所示:

from collections import ChainMap
merged2 = ChainMap(dic1,dic2)
print(merged2) 
# ChainMap({'x': 1, 'y': 2}, {'y': 3, 'z': 4})

77 命名元组提高可读性

from collections import namedtuple

point = namedtuple('point', ['x', 'y'])  # 定义名为point的元组,字段属性有x,y
lst = [point(1, 2), point(-1, -2), point(0, 0)]
print(lst[0].x - lst[1].x)
# 2

78 样本抽样

使用sample抽样,如下例子从100个样本中随机抽样10个。

from random import randint, sample

# 生成100个0-50的随机整数
lst = [randint(0, 50) for _ in range(100)]
# 随机抽样10个数
lst_sample = sample(lst, 10)
print(lst_sample)
# [43, 28, 46, 2, 32, 6, 20, 4, 17, 2]

79 重洗数据集

使用shuffle用来重洗数据集,值得注意shuffle是对lst就地(in place)洗牌,节省存储空间

from random import shuffle, randint

lst = [randint(0, 50) for _ in range(10)]
print(lst)
# [40, 3, 14, 9, 2, 10, 50, 26, 23, 24]

shuffle(lst)
print(lst)
# [50, 23, 26, 3, 9, 10, 2, 40, 24, 14]

80 10个均匀分布的坐标点

random模块中的uniform(a,b)生成[a,b)内的一个随机数,如下生成10个均匀分布的二维坐标点

from random import uniform

# 生成5个x,y都是0-10的坐标
lst = [(uniform(0, 10), uniform(0, 10)) for _ in range(5)]
print(lst)
# [(7.701427108117793, 3.843003615554367), (9.71150124517058, 2.090424005828091), (3.915291689286997, 4.616035628641485), (3.582206422891745, 9.19287429253042), (6.079509418205635, 1.9340874788475404)]

81 10个高斯分布的坐标点

random模块中的gauss(u,sigma)生成均值为u, 标准差为sigma的满足高斯分布的值,如下生成10个二维坐标点,样本误差(y-2*x-1)满足均值为0,标准差为1的高斯分布:

from random import gauss

x = range(10)
y = [2 * xi + 1 + gauss(0, 1) for xi in x]
points = list(zip(x, y))

print(points)
# [(0, 0.417218685529018), (1, 4.243458247551363), (2, 4.473432148883277), (3, 7.118490124237332), (4, 8.932064430583193), (5, 11.984077173427817), (6, 12.618979691200993), (7, 14.78533743861569), (8, 15.752137963359067), (9, 17.244251639215747)]

82 chain高效串联多个容器对象

chain函数串联a和b,兼顾内存效率同时写法更加优雅。

from itertools import chain

a = [1, 3, 5, 0]
b = (2, 4, 6)

lst = list(chain(a, b))
print(lst)
# [1, 3, 5, 0, 2, 4, 6]

83 操作函数对象

def f():
    print('i am f')


def g():
    print('i am g')


[f, g][1]()
# i am g

创建函数对象的list,根据想要调用的index,方便统一调用。

84 生成逆序序列

list(range(10,-1,-1)) # [10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0]

第三个参数为负时,表示从第一个参数开始递减,终止到第二个参数(不包括此边界)

85 函数的五类参数使用例子

python五类参数:位置参数,关键字参数,默认参数,可变位置或关键字参数的使用。

def f(a, *b, c=10, **d):
    print(f'a:{a},b:{b},c:{c},d:{d}')


# 默认参数c不能位于可变关键字参数d后。
# 调用f:
f(1, 2, 5, width=10, height=20)
# a:1,b:(2, 5),c:10,d:{'width': 10, 'height': 20}
# 可变位置参数b实参后被解析为元组(2,5);而c取得默认值10; d被解析为字。

# 再次调用f:
f(a=1, c=12)
# a:1,b:(),c:12,d:{}
# a=1传入时a就是关键字参数,b,d都未传值,c被传入12,而非默认值。
# 注意观察参数a, 既可以f(1),也可以f(a=1)其可读性比第一种更好,建议使用f(a=1)。

# 如果要强制使用f(a=1),需要在前面添加一个星号:
def g(*, a):
    print(f'a:{a}')
# 此时必须使用f(a=1)调用方法
g(a=1)
# a:1

86 使用slice对象

使用同一种切法[1:10:2]对蛋糕cake1与cake2进行切割:

from random import randint

cake1 = list(range(5, 0, -1))
# cake1=[5, 4, 3, 2, 1]
b = cake1[1:10:2]
# 切得蛋糕b=[4, 2]

cake2 = list(range(1, 11))
# cake2=[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
d = cake2[1:10:2]
# 切得蛋糕d=[2, 4, 6, 8, 10]

这里可以将切法定义成slice对象,从而避免繁琐的操作:

cake_slice = slice(1, 10, 2)
cake1 = list(range(5, 0, -1))
cake2 = list(range(1, 11))

print(cake1[cake_slice])
print(cake2[cake_slice])
# [4, 2]
# [2, 4, 6, 8, 10]

87 lambda 函数

# 排序
dic = {'a': 3, 'b': 2, 'c': 1}
print(sorted(dic.items(), key=lambda item: item[1]))
# [('c', 1), ('b', 2), ('a', 3)]

# 求长列表
lsts = [[1, 2, 3], [1, 2], [2, 3, 4, 5]]
print(max(lsts, key=lambda l: len(l)))
# [2, 3, 4, 5]

88 粘性之禅

七行烧脑代码:

def product(*args, repeat=1):
    pools = [tuple(pool) for pool in args] * repeat
    result = [[]]
    for pool in pools:
        result = [x + [y] for x in result for y in pool]
    for prod in result:
        yield tuple(prod)


rtn = product('xyz', '12', repeat=3)
print(list(rtn))

89 元类

xiaoming, xiaohong, xiaozhang都是学生,这类群体叫做Student.
Python 定义类的常见方法,使用关键字class

class Student():
	pass

xiaoming, xiaohong, xiaozhang是类的实例,则:

xiaoming = Student()
xiaohong = Student()
xiaozhang = Student()

创建后,xiaoming 的__class__属性,返回的便是Student类:

xiaoming.__class__
__main__.Student

问题在于,Student类有__class__属性,如果有,返回的又是什么?

xiaoming.__class__.__class__
type

返回type。

那么,我们不妨猜测:Student类,类型就是type

换句话说,Student类就是一个对象,它的类型就是type。

所以,Python 中一切皆对象,类也是对象

Python 中,将描述Student类的类被称为:元类。

既然Student类可创建实例,那么type类可创建实例吗?如果能,它创建的实例就叫:了。

Student = type('Student',(),{})

Student
__main__.Student

它与使用class关键字创建的Student类一模一样。

元类,确实使用不是那么多,也许先了解这些,就能应付一些场合。就连 Python 界的领袖TimPeters都说:

“元类就是深度的魔法,99%的用户应该根本不必为此操心。”

90 对象序列化

对象序列化,是指将内存中的对象转化为可存储或传输的过程。很多场景,直接一个类对象,传输不方便。

但是,当对象序列化后,就会更加方便,因为约定俗成的,接口间的调用或者发起的 web 请求,一般使用 json 串传输。

实际使用中,一般对类对象序列化。先创建一个 Student 类型,并创建两个实例。

class Student():
    def __init__(self, **args):
        self.ids = ['ids']
        self.name = args['name']
        self.address = args['address']


xiaoming = Student(ids=1, name='xiaoming', address='北京')
xiaohong = Student(ids=2, name='xiaohong', address='南京')

导入 json 模块,调用 dump 方法,就会将列表对象 [xiaoming,xiaohong],序列化到文件 json.txt中。

import json

with open('90json.txt', 'w') as f:
    json.dump([xiaoming, xiaohong], f, default=lambda obj: obj.__dict__, ensure_ascii=False, indent=2, sort_keys=True)

生成文件内容:

[
  {
    "address": "北京",
    "ids": [
      "ids"
    ],
    "name": "xiaoming"
  },
  {
    "address": "南京",
    "ids": [
      "ids"
    ],
    "name": "xiaohong"
  }
]
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【Python之路——基础回顾90列】 的相关文章

  • python基础案例练习一

    员工管理系统练习 1 显示系统菜单 2 获得用户输入的菜单 3 根据用户的输入判断执行操作 存储员工信息 employee def show menu print 20 员工管理系统菜单 20 print 1 添加员工信息 print 2
  • C 、C++ 、Java、Python、JavaScript数据类型对比介绍

    C C Java Python JavaScript数据类型对比介绍 C C Java Python JavaScript数据类型对比如下 C语言 静态类型语言 需要在声明变量时指定类型 基本数据类型包括 整型 int 通常分为有符号 si
  • python作业记录1_字典运用的实例

    帮朋友做了几个作业题目 记录一下 一 某人到超市购买了以下物品 先需要对货物金额进行统计 清单如下图所示 牛奶 65 面包 15 可乐 39 饼干 45 糖果 24 水果 35 8 要求 1 使用字典保存以上数据 2 可乐的金额统计出错 请
  • 2019零基础如何学好Python?学习Python的策略是什么?

    跟几个IT界的大佬提起python 他们说零基础学好python很简单 python进阶需要花费写气力 都说Python简单易学 那么零基础如何学好Python 有哪些必须学的知识 学习的策略技巧有哪些 今天这篇文章将会给你启发 Pytho
  • Python学习-----起步1(Python的下载,脚本与交互模式,注释)

    目录 Python的下载 解释器 IDLE进入Python解释器 交互模式 脚本模式 注释 单行注释 多行注释 Python的下载 解释器 百度网盘链接 https pan baidu com s 1WEmOAGGHtHc1fxZzNGKu
  • pyqt5按钮点击时传递参数(通过lambda表达式)

    pyqt5中按钮点击事件的响应 常见的是下面的方式 self btn clicked connet self click method 现在想在按钮click的时候能够传递参数 可以借助lambda表达式 self btn clicked
  • Python: 装饰器和语法糖

    一 Python 装饰器 Python 装饰器本身就是一个函数 它的作用是装饰一个其他的函数 但是不改变原有的程序功能 还要增添新的功能 调用函数时的接口没有变化 比如 装修一个房子 如果不隔音 我在墙上加一层隔音板 却不能把墙拆了 换成隔
  • python实现链表的旋转

    python实现链表的旋转 链表是一种常用的数据结构 实现起来也不难 但当我们需要将链表中的元素旋转时 就会有一些困难 本文介绍基于python语言的链表旋转实现方法 实现思路 链表旋转可以通过移动节点的位置来实现 我们可以找到需要旋转的位
  • Python 学习笔记(1):心历路程,print()函数,变量和赋值

    也不知道从什么时候开始 对python这个语言有兴趣了 可能是公众号 广告推给我的吧 对python这个语言的印象不错 哈哈 之前大学的时候 对编程就比较感兴趣 反应也还可以 但毕竟不是专门学的 能力不够 毕业之后从事了与专业不相关的工作
  • Python 文件操作(IO)

    文章目录 前言 一 打印到屏幕 print 二 读取键盘输入 1 raw input 2 input 三 读写文件 读文件 写文件 前言 和其它编程语言一样 Python 也具有操作文件 I O 的能力 比如打开文件 读取和追加数据 插入和
  • python文件操作图形化——python实战项目:单词练习系统

    python 文件操作与图形化编程 目录 python 文件操作与图形化编程 文件基本操作 图形化界面tkinter 单词练习系统 文件基本操作 D Python example txt 文件路径 D Python 文件名 example
  • python基础----02-----字面量、变量、数据类型及其转换、标识符以及字符串、数据输入(input语句)

    一 字面量 1 字面量 字面量 在代码中 被写下来的的固定的值称之为字面量 类似C C 的字符串常量 1 1 常见的python值类型 Python中常见的值类型 实际上在C C 字面量和这里的类型还是有区别的 体现在内存存储中 字面量存储
  • python水仙花数

    题目 打印出所有的 水仙花数 所谓 水仙花数 是指一个三位数 其各位数字立方和等于该数本身 例如 153是一个 水仙花数 因为153 1的三次方 5的三次方 3的三次方 def narcissus narcissus number grou
  • python 二叉树,先序回溯,层序队列,队列基础用法,二叉树深度

    文章目录 1 创建二叉树 先 中 后遍历 2 n个节点有多少种二叉树 递归 3 层序遍历 4 队列基础用法 五 二叉树深度 1 创建二叉树 先 中 后遍历 创建二叉树 class TreeNode def init self data le
  • Python学习-----模块5.0(文件管理大师-->os模块)

    目录 前言 1 os getcwd 2 os listdir path 3 os walk path 4 os path exists path 5 os mkdir path 6 os makedirs path exist ok Tru
  • python3 隐藏print的标准输出

    在使用python调用函数时 想将函数中的print输出禁止掉又不想改函数的代码 可以定义如下HiddenPrints类解决 class HiddenPrints def enter self self original stdout sy
  • python机器学习之十一 numpy库之矩阵(matrix)

    本文主要介绍numpy库中的矩阵 矩阵的创建 常见的矩阵运算 矩阵 列表 数组之间的转换 矩阵的创建 语法格式 numpy matrix data dtype data 数据 dtype 数据类型 同数组 如 m2 np matrix 1
  • 语法6:raise - 触发异常

    目录 1 基础格式 2 raise 单独语句 3 raise class 4 raise instance 5 raise from 6 try raise 实现循环跳出
  • GIS栅格平均值计算

    GIS中批量计算tif栅格文件平均值 coding UTF 8 import arcpy import os inws r C Users DELL Desktop 新建文件夹 arcpy env workspace inws raster
  • Python错误处理的艺术:使用retrying库实现高效重试机制

    简介 学习如何使用 Python 的 retrying 库来处理在程序运行过程中可能出现的各种异常和错误 retrying 是一种简单 易于使用的重试机制 帮助我们处理由网络问题或其他暂时性错误引起的失败 在很多情况下 简单的重试可能就是解

随机推荐

  • Python编写微信打飞机小游戏(七)

    如果觉得这篇文章对您有所启发 欢迎关注我的公众号 我会尽可能积极和大家交流 谢谢 Python编写微信打飞机小游戏 一 Python编写微信打飞机小游戏 二 Python编写微信打飞机小游戏 三 Python编写微信打飞机小游戏 四 Pyt
  • webpack

    一 是什么 loader 用于对模块的 源代码 进行转换 在 import 或 加载 模块时预处理文件 webpack做的事情 仅仅是分析出各种模块的依赖关系 然后形成资源列表 最终打包生成到指定的文件中 如下图所示 在webpack内部中
  • 保证业务高效运营 专有云虚拟网络是关键

    随着越来越多的企业用户上云 且客户业务场景多种多样的情况下 云计算面临的挑战也越来越多 如企业多 IDC 异地办公区 远程运维人员接入到企业内网需要一致的体验等场景下 还要提供高可靠 安全和易维护的网络能力 我们可以通过组合百度智能云网络模
  • ue4 解决编译保存蓝图时报无法报存资源.uasset错

    当你在打开蓝图时 逻辑没有任何错误 甚至你没有做任何修改 在编译保存时报资源错误 如下图 这时候 你打开任务管理器 在后台进程 你会发现一个在跑的ue进程 结束任务后就可以继续正常的编译保存了
  • 廉价的家用工作站方案:ThinkPad 存储升级及数据迁移

    最近 给当台式服务器一样使用了两年的 ThinkPad 做了存储升级和数据迁移 对硬盘也做了额外的散热处理 本篇文章里 我们分享下相关的经验和思考 希望能够帮助到有同样诉求的你 写在前面 本文的 主角 是一台 7x24 小时使用了两年的 T
  • 【基础篇】关于专栏介绍及ESP32环境搭建(vs code)

    前言 本专栏将会从零到实战的学习ESP32开发 将会持续更新 其中大概包括基础篇 实战篇和提高篇以及一些常见的错误如何解决 一 ESP32介绍 ESP32是 Espressif 开发的一系列低成本 低功耗的片上系统 SoC 微控制器 包括
  • matlab练习程序(模拟退火SA)

    模拟退火首先从某个初始候选解开始 当温度大于0时执行循环 在循环中 通过随机扰动产生一个新的解 然后求得新解和原解之间的能量差 如果差小于0 则采用新解作为当前解 如果差大于0 则采用一个当前温度与能量差成比例的概率来选择是否接受新解 温度
  • 带头结点的头插法和尾插法创建单链表

    首先我们先定义一个链表的结构体 typedef int DataType typedef struct Node DataType data struct Node next SLNode SLnode 定义链表的结构体 因为是带头节点的链
  • Easyx-----c++实现经典Windows扫雷

    一些说明 关于扫雷的基本实现 我在这篇博客已经详细介绍Easyx c语言实现简易版扫雷 考拉爱睡觉鸭 的博客 CSDN博客 这里不再描述 主要是以c 单例设计模式的方式实现扫雷 多加了右键点击笑脸作弊功能 不会扫雷的小伙伴也可以愉快玩耍了
  • vue3的slot插槽用法,`slot-scope` are deprecated

    前言 vue3的插槽使用方法发生了改变 和vue2相比较 使用vue2的写法 会报错 slot scope are deprecated vue2 上下对应 title是自己随便起的名字 1 定义一个普通的插槽 可以用div 任何标签 di
  • 用堆实现优先级队列(Priority Queue)

    1 优先级队列定义 优先级队列 priority queue 是0个或多个元素的集合 每个元素都有一个优先权 对优先级队列执行的操作有 1 查找 2 插入一个新元素 3 删除 一般情况下 查找操作用来搜索优先权最大的元素 删除操作用来删除该
  • Java Web学习笔记1

    URL格式说明 http www aspxfans com 8080 news index asp boardID 5 ID 24618 page 1 name 从上面的URL可以看出 一个完整的URL包括以下几部分 1 协议部分 该URL
  • JWT-RS256公钥和私钥创建

    摘要 最近在做ASP NET Core 微服务项目中 用到JWT RS256 创建公钥和私钥来替代原先的对称加密方式 于是在网上找一些创建秘钥的工具 搜了很多终于找到一个非常方便的工具 在这里贡献给大家 操作步骤 请看截图 工具下载链接下载
  • QuotaExceededError the quota has been exceeded --- Firefox 报错解决

    QuotaExceededError the quota has been exceeded Firefox 报错解决 Firefox 报错 QuotaExceededError the quota has been exceeded 在F
  • 联想小新Pro13解决黑苹果下麦克风不可用(曲线救国)

    众所周知 联想小新Pro13在安装黑苹果系统之后不能正常地使用麦克风的功能 这也成为了除开原装网卡无隔空和随航以外 小新Pro13在黑苹果下唯一不能使用的功能了 今天来讲一下我是如何解决这个问题的 解决思路 首先讲一下解决思路 写驱动是不会
  • DMAIC方法的五个步骤

    DMAIC是指一种数据驱动的质量战略 用于改进流程 是公司 六西格玛质量计划 的组成部分 DMAIC是五个相互关联的阶段的首字母缩写 定义 测量 分析 改进和控制 DMAIC方法旨在允许灵活性和迭代工作 它是 定义 测量 分析 改进 和 控
  • 记一次通过binlog日志恢复MySQL数据库的经历

    通过binlog日志恢复MySQL数据库的数据 一 起因 起因是我在自己服务器上搭建的博客被黑客攻击 黑客删除了我的数据库并且要求支付比特币才给我恢复 博客所有的表和数据都被清空 只留下了勒索金额和地址 如图 穷鬼如我当然是 二 恢复数据
  • 认识djiango第一章(展示日志)

    定义 Django是python的一个主流web框架 提供一站式解决方案 开发成本低 内建ORM 数据管理后台 登录认证 表单 RESTAPI等功能 适合开发中大型项目 其他web框架 Flask 轻量级 Tornado 异步 注 本次编写
  • JAVA求素数和模拟条件

    题目 牛宝在新的一年里打算扫除过去身上的坏运气 故他打算筛选出今年第1 365天中符合今年自己的那些幸运数字 在今年对应数字的那一天做特殊的事 这些数字受限于乾卦和坤卦两个卦象条件 牛宝需自己破译出来才行 你能帮助他吗 根据牛宝得知的乾坤卦
  • 【Python之路——基础回顾90列】

    基础 1 求绝对值 求绝对值或复数的模 gt gt gt abs 6 6 2 元素都为真 接受一个迭代器 如果迭代器的 所有元素 都为真 那么返回 True 否则返回 False gt gt gt all 0 1 2 3 False gt