百科问答小站 logo
百科问答小站 font logo



Python 语言有什么奇技淫巧吗? 第1页

  

user avatar   chaoscrocodile 网友的相关建议: 
      

随便来一个好玩的自加对象

       >>> add = type('_', (int,), {'__call__': lambda s,x:add(s.numerator+x)}) >>> add(1) 1 >>> add(1)(2) 3 >>> add(1)(2)(3)(4)(5) 15 >>>      

再来一个管道操作

       >>> from functools import partial >>> F = type('_', (partial,), {'__ror__': lambda s,o: s(*o) if isinstance(o, tuple) else s(o)}) >>> [2,3]|F(sum) 5 >>> range(10) | F(filter, lambda x: x % 2) | F(sum) 25 >>>      


user avatar   navegador 网友的相关建议: 
      
       python 的花招,只要不考虑运行效率,主要就是 A. 玩那一堆  __xxxx__ 函数, B. 下面几个自带的库     import ast     import inspect      import functools     import ctypes C.  和这个函数 id() A,B,C 基本可以让你为所欲为     

# 破坏built-in 类

       #谨慎使用  import inspect  import functools import ctypes   class PyObject(ctypes.Structure):     class PyType(ctypes.Structure):         pass     ssize = ctypes.c_int64 if ctypes.sizeof(ctypes.c_void_p) == 8 else ctypes.c_int32     _fields_ = [         ('ob_refcnt', ssize),         ('ob_type', ctypes.POINTER(PyType)),     ]     def incref(self):         self.ob_refcnt += 1     def decref(self):         self.ob_refcnt -= 1   def sign(klass,value):     class SlotsProxy(PyObject):         _fields_ = [('dict', ctypes.POINTER(PyObject))]     name = klass.__name__     target = klass.__dict__     proxy_dict = SlotsProxy.from_address(id(target))     namespace = {}     ctypes.pythonapi.PyDict_SetItem(         ctypes.py_object(namespace),         ctypes.py_object(name),         proxy_dict.dict,     )     namespace[name]["签名"] = value  # 修改 built-in  str sign(str,"某某人专用")  >>> "1234567".签名 '某某人专用' >>> >>> "abcde".签名.签名.签名.签名.签名.签名.签名 '某某人专用' >>>     


#土制 单参化

       import inspect  import functools   def uargs(f):     arg_names = inspect.getfullargspec(f).args     def _func(arg_names,d):         args = []         for i in range(len(arg_names)):             #necessary for version < 3.5 to keep order             k = arg_names[i]             args.append(d[k])         return(f(*args))     func = functools.partial(_func,arg_names)     return(func)   def cufunc(a,b,c,d):     print(a,b,c,d)  myfunc = uargs(cufunc) myfunc = uargs(cufunc) myfunc({"a":100,"b":200,"c":300,"d":400}) 100 200 300 400     

# 土制 库里化

       import inspect  import functools   class curry():     def goose():         def egg(*args):             egg.arguments.extend(args)             return(egg)         egg.__setattr__("arguments",[])         return(egg)     def __init__(self,orig_func):         params_count = inspect.getfullargspec(orig_func).args.__len__()         self.orig_func = orig_func         self.params_count = params_count         self.egg = goose()     def __call__(self,*args):         count = self.params_count         orig_func = self.orig_func         egg = self.egg         egg(*args)         args_lngth = len(egg.arguments)         if(args_lngth<count):             return(self)         else:             args = egg.arguments             egg.arguments = []             return(orig_func(*args))     def __repr__(self):         return(self.egg.arguments.__repr__())   def cufunc(a,b,c,d):     print(a,b,c,d)   myfunc = curry(cufunc) myfunc(10) myfunc(20) myfunc(30)(40) #10 20 30 40     

python 因为暴露了 id()函数 和ctypes,可以认为python里没有primitive 和native/built-in,也就意味着基本上你想做什么都可以


user avatar   zhijun-liu 网友的相关建议: 
      

0、两个变量值互换

       >>> a=1 >>> b=2 >>> a,b=b,a >>> a 2 >>> b 1     

1、连续赋值

       a = b = c = 50     

2、自动解包

       >>> a,b,c = [1,2,3] >>> a 1 >>> b 2 >>> c 3 >>> >>> >>> a, *others = [1,2,3,4] >>> a 1 >>> others [2, 3, 4] >>>     

4、链式比较

       a = 15 if (10 < a < 20):     print("Hi")     

等价于

       a = 15 if (a>10 and a<20):     print("Hi")     

5、重复列表

       >>> [5,2]*4 [5, 2, 5, 2, 5, 2, 5, 2]     

6、重复字符串

       >>> "hello"*3 'hellohellohello'     

7、三目运算

       age = 30 slogon = "牛逼" if  age == 30 else "niubility"     

等价于

       if age == 30:     slogon = "牛逼" else:     slogon = "niubility"     

8、字典合并

       >>> a= {"a":1} >>> b= {"b":2} >>> {**a, **b} {'a': 1, 'b': 2} >>>     

9、字符串反转

       >>> s = "i love python" >>> s[::-1] 'nohtyp evol i' >>>     

10、列表转字符串

       >>> s = ["i", "love", "pyton"] >>> " ".join(s) 'i love pyton' >>>     

11、for else 语句

检查列表foo是否有0,有就提前结束查找,没有就是打印“未发现"

       found = False for i in foo:     if i == 0:         found = True         break if not found:      print("未发现")     

如果用 for else 语法来写可以省几行代码

       for i in foo:     if i == 0:         break else:     print("未发现")     

11、字典推导式

       >>> m = {x: x**2 for x in range(5)} >>> m {0: 0, 1: 1, 2: 4, 3: 9, 4: 16} >>>     

12、用Counter查找列表中出现最多的元素

       >>> content = ["a", "b", "c", "a", "d", "c", "a"] >>> from collections import Counter >>> c = Counter(content) >>> c.most_common(1) [('a', 3)] >>>     

出现第1多的元素是a,一共出现3次, 你也可以用类似的方法找出第二多或者第三多的

13、默认值字典

给字典中的value设置为列表,普通方法

       >>> d = dict() if 'a' not in d:     d['a'] = [] d['a'].append(1)     

使用defaultdict默认字典构建一个初始值为空列表的字典

       from collections import defaultdict d = defaultdict(list) d['a'].append(1)     

14、赋值表达式

这是3.8的新特性,赋值表达式又成为海象运算符:=, 可以将变量赋值和表达式放在一行,什么意思? 看代码就明白

       >>> import re >>> data = "hello123world" >>> match = re.search("(d+)", data)  # 3 >>> if match:                         # 4 ...     num = match.group(1) ... else: ...     num = None >>> num '123'     

第3、4行 可以合并成一行代码

       >>> if match:=re.search("(d+)", data): ...     num = match.group(1) ... else: ...     num = None ... >>> num '123'     

15、isinstance

isinstance 函数可用于判断实例的类型,其实第二个参数可以是多个数据类型组成的元组。例如:

       isinstance(x, (int, float))  # 等价于  isinstance(x, int) or isinstance(x, float)     

类似的函数还有字符串的startswith,endswith,例如:

       s.startswith(('"""', "'''"))  # 等价于  s.startswith("'''") or s.startswith('"""')     

16、用 http.server 共享文件

       # python3 python3 -m http.server  # python2 python -m SimpleHTTPServer 8000     

效果如下,可以在浏览器共享文件目录,方便在局域网共享文件

17、zip 函数实现字典键值对互换

       >>> lang = {"python":".py", "java":".java"}  >>> dict(zip(lang.values(), lang.keys())) {'.java': 'java', '.py': 'python'}     

18、查找列表中出现次数最多的数字

       test = [1, 2, 3, 4, 2, 2, 3, 1, 4, 4, 4, 5] >>> max(set(test), key=test.count) 4     

19、使用 slots 节省内存

       class MyClass(object):     def __init__(self, name, identifier):         self.name = name         self.identifier = identifier         self.set_up()   print(sys.getsizeof(MyClass))   class MyClass(object):     __slots__ = ['name', 'identifier']      def __init__(self, name, identifier):         self.name = name         self.identifier = identifier         self.set_up()   print(sys.getsizeof(MyClass))  # In Python 3.5 # 1-> 1016 # 2-> 888     

20、扩展列表

       >>> i = ['a','b','c'] >>> i.extend(['e','f','g']) >>> i ['a', 'b', 'c', 'e', 'f', 'g'] >>>     

21、列表负数索引

       >>> a = [ 1, 2, 3] >>> a[-1] 3     

22、列表切片

       >>> a = [0,1,2,3,4,5,6,7,8,9] >>> a[3:6] # 第3个到第6个之间的元素 [3, 4, 5] >>> a[:5] # 前5个元素 [0, 1, 2, 3, 4] >>> a[5:] # 后5个元素 [5, 6, 7, 8, 9] >>> a[::] # 所有元素(拷贝列表) [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] >>> a[::2] # 偶数项 [0, 2, 4, 6, 8] >>> a[1::2] # 奇数项 [1, 3, 5, 7, 9] >>> a[::-1]  # 反转列表 [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]     

23、二维数组变一维数组

       import itertools >>> a = [[1, 2], [3, 4], [5, 6]] >>> i = itertools.chain(*a) >>> list(i) [1, 2, 3, 4, 5, 6]     

24、有索引的迭代

       >>> a = ['Merry', 'Christmas ', 'Day'] >>> for i, x in enumerate(a): ...     print '{}: {}'.format(i, x) ... 0: Merry 1: Christmas 2: Day     

25、列表推导式

       >>> le = [x*2 for x in range(10)] >>> le  # 每个数乘以2 [0, 2, 4, 6, 8, 10, 12, 14, 16, 18]  >>> le = [x for x in range(10) if x%2 == 0] >>> le  # 获取偶数项 [0, 2, 4, 6, 8]     

26、生成器表达式

       >>> ge = (x*2 for x in range(10)) >>> ge <generator object <genexpr> at 0x01948A50> >>> next(ge) 0 >>> next(ge) 2 >>> next(ge) 4 ... >>> next(ge) Traceback (most recent call last):   File "<stdin>", line 1, in <module> StopIteration     

27、集合推导式

       Python  >>> nums = {n**2 for n in range(10)} >>> nums {0, 1, 64, 4, 36, 9, 16, 49, 81, 25}     

28、判断key是否存在字典中

       >>> d = {"1":"a"} >>> d['2'] Traceback (most recent call last):   File "<stdin>", line 1, in <module> KeyError: '2' >>> '1' in d True >>> d['1'] 'a' >>> d.get("1") 'a' >>> d.get("2") >>>     

29、装饰器

       from functools import wraps  def tags(tag_name):     def tags_decorator(func):         @wraps(func)         def func_wrapper(name):             return "<{0}>{1}</{0}>".format(tag_name, func(name))         return func_wrapper     return tags_decorator  @tags("p") def get_text(name):     """returns some text"""     return "Hello " + name  print(get_text("Python"))  >>><p>Hello Python</p>     

30、字典子集

       >>> def sub_dicts(d, keys): ...     return {k:v for k, v in d.items() if k in keys} ... >>> sub_dicts({1:"a", 2:"b", 3:"c"}, [1,2]) {1: 'a', 2: 'b'}     

31、反转字典

       >>> d = {'a': 1, 'b': 2, 'c': 3, 'd': 4} >>> >>> zip(d.values(), d.keys()) <zip object at 0x019136E8> >>> z = zip(d.values(), d.keys()) >>> dict(z) {1: 'a', 2: 'b', 3: 'c', 4: 'd'}     

32、具名元组

       >>> from collections import namedtuple >>> Point = namedtuple("Point", "x,y") >>> p = Point(x=1, y=2) >>> p.x 1 >>> p[0] 1 >>> p.y 2 >>> p[1] 2     

33、设置字典默认值

       >>> d = dict() >>> if 'a' not in d: ...     d['a'] = [] ... >>> d['a'].append(1) >>> d {'a': [1]}  >>> d.setdefault('b',[]).append(2) >>> d {'a': [1], 'b': [2]} >>>     

34、有序字典

       >>> d = dict((str(x), x) for x in range(10)) >>> d.keys() # key 无序 dict_keys(['0', '1', '5', '9', '4', '6', '7', '8', '2', '3'])   >>> from collections import OrderedDict >>> m = OrderedDict((str(x), x) for x in range(10)) >>> m.keys() # key 按照插入的顺序排列 odict_keys(['0', '1', '2', '3', '4', '5', '6', '7', '8', '9'])     

35、列表中最大最小的前n个数

       >>> import heapq a = [51, 95, 14, 65, 86, 35, 85, 32, 8, 98] >>> heapq.nlargest(5,a) [98, 95, 86, 85, 65] >>> heapq.nsmallest(5,a) [8, 14, 32, 35, 51] >>>     

36、打开文件

       >>> with open('foo.txt', 'w') as f: ...     f.write("hello") ...     

37、两个列表组合成字典

       list_1 = ["One","Two","Three"] list_2 = [1,2,3] dictionary = dict(zip(list_1, list_2)) print(dictionary)     

38、去除列表中重复元素

       my_list = [1,4,1,8,2,8,4,5] my_list = list(set(my_list)) print(my_list)     

39、打印日历

       import calendar  >>> print(calendar.month(2021, 1))     January 2021 Mo Tu We Th Fr Sa Su              1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31     

40、匿名函数

       def add(a, b):     return a+b     

等价于

       >>> add = lambda a,b:a+b >>> add(1,2) 3     

如果对您有帮助,麻烦您给我点个小小的赞,后面我还会写更多实用技巧,关注我不迷路。如果还整准备入门,可以了解下面这个闯关式教学




  

相关话题

  全世界有上千种编程语言,为什么程序员都只学习那几个主流语言? 
  C 语言中不同类型指针的大小是否完全相同,为什么? 
  有密集型(高频) https api 请求的需求,该用什么技术栈? 
  多核和分布式的编程环境促使产生了并发编程语言,那么它和传统的编程语言有什么本质的不同? 
  编程语言是不是代码越多越逻辑越严谨? 
  如何评价 Golang 1.5 更新? 
  如何评价阿里味编程语言 pua lang? 
  到底存在不存在不适合学编程的人? 
  如何看待 Python 3.9 以上的版本不再支持 Windows 7? 
  为什么 Java 会有 JVM,其它语言怎么没有对应的 VM? 

前一个讨论
最后一天了,如何用一张照片,告别 2020 年?
下一个讨论
程序员的你,有哪些炫技的代码写法?





© 2024-11-24 - tinynew.org. All Rights Reserved.
© 2024-11-24 - tinynew.org. 保留所有权利