首页 文章 精选 留言 我的

精选列表

搜索[文件操作],共10000篇文章
优秀的个人博客,低调大师

Python骚操作:动态定义函数

标题:Python Tips: Dynamic function definition 作者:Philip Trauner 译者:豌豆花下猫 链接:https://philip-trauner.me/blog/post/python-tips-dynamic-function-definition 基于 MIT 许可协议 在 Python 中,没有可以在运行时简化函数定义的语法糖。然而,这并不意味着它就不可能,或者是难以实现。 from types import FunctionType foo_code = compile('def foo(): return "bar"', "<string>", "exec") foo_func = FunctionType(foo_code.co_consts[0], globals(), "foo") print(foo_func()) 输出: bar 剖析 逐行检视代码,你会发现语言/解释器的屏障是多么脆弱。 >>> from types import FunctionType Python 文档通常不会列出那些非用于手动创建的类的特征(这是完全合理的)。有三种方法可以解决这个问题:help()、inspect(无法查看内置方法)、以及最后的解决方案,即查看 CPython 源代码。 在本例中,help() 与 inspect 都可以完成工作,但是查看实际的源代码,则会揭示出关于数据类型的更多细节。 >>> from inspect import signature >>> signature(FunctionType) <Signature (code, globals, name=None, argdefs=None, closure=None)> 1. code 内部是一个PyCodeobject ,作为types.CodeType 对外开放。非内置方法拥有一个__code__ 属性,该属性保存了相应的代码对象。利用内置的 compile() 方法,可以在运行期创建types.CodeType 对象。 2. globals 如果一个函数引用的变量不是在局部定义的,而是作为参数转入、由默认参数值提供、或者通过闭包上下文提供,则它会在 globals 字典中查找。 内置的 globals() 方法会返回一个对当前模块的全局符号表(global symbol table)的引用 ,因此能被用来提供一个总是与当前表的状态相一致的字典。传入任意其它的字典也是可以的(FunctionType((lambda: bar).__code__, {"bar" : "baz"}, "foo")() == "baz")。 3. name(可选) 控制所返回的函数的__name__ 属性。只真正对 lambdas 有用(由于匿名性,它们通常没有名称),并且重命名函数。 4. argdefs(可选) 通过传入一个包含任意类型的对象的元组,提供了一个方式来供应默认参数值(def foo(bar="baz"))。(FunctionType((lambda bar: bar).__code__, {}, "foo", (10,))() == 10)。 5. closure(可选) (如果需要在 CPython(PyPy,Jython,...)以外的其它 Python VM 中执行,可能不应该触及,因为它严重地依赖于实现细节)。 一个cell 对象的元组。创建 cell 对象并非完全是直截了当的,因为需要调用 CPython 的内部组件,但有一个库可以令它更加方便:exalt (无耻的广告)。(译注:这个库是作者开发的。) >>> foo_code = compile('def foo(): return "bar"', "<string>", "exec") compile() 是一个内置方法,因此同时也是文档丰富的。 exec 模式被用到,因为定义函数需要用多个语句。 >>> foo_func = FunctionType(foo_code.co_consts[0], globals(), "foo") 聚合全部内容,并将动态创建的函数指定给一个变量。 那个被前一句代码编译成的函数,成为了生成的代码对象的第一个常量,因此仅仅指向 foo_code 是不充分的。这是 exec 模式的直接后果,因为生成的代码对象可以包含多个常量。 >>> print(foo_func()) 动态生成的函数可以像其它函数一样被调用。 结尾 除了做实验,需要用到动态创建函数的场景很少。 玩耍(Toying around) Python 的内部构件是一种深入学习这门语言的好方法。 如果需要,可以毫不费力地越过解释器/语言的界线。 还是一如既往地:不要滥用语言 (好吧,一点点也无妨,对吧?) --------(译文完)-------- 花下猫语: 在上一篇《Python进阶:如何将字符串常量转为变量?》中,我介绍了两种动态修改变量 的方法(globals() 与 exec())。写完之后,我偶然发现,在自己列的“计划转载清单”中,有这一篇相关的文章,它介绍了动态定义函数 的方法。因为它的相关度太大,而篇幅又是那么小(核心代码只有三行,文中其它内容都是在解释其背后的原理),我觉得如果翻译出来的话,效果会更好,所以就抓紧时间翻译出来了。建议与前一篇文章配合阅读。 公众号【Python猫】, 专注Python技术、数据科学和深度学习,力图创造一个有趣又有用的学习分享平台。本号连载优质的系列文章,有喵星哲学猫系列、Python进阶系列、好书推荐系列、优质英文推荐与翻译等等,欢迎关注哦。PS:后台回复“爱学习”,免费获得一份学习大礼包。

优秀的个人博客,低调大师

Python字符串基础操作

找到我就是缘分,为技术一起努力! 格式符 # price_width = 10 item_width = width - price_width header_format = '%-*s%*s' format = '%-*s%*.2f' print '=' * width print header_format % (item_width, 'Item', price_width, 'Price') print '-' * width print format % (item_width,'Apples',price_width,0.4) print format %(item_width,'Pears', price_width,0.5) print format %(item_width,'Cantaloupes',price_width,1.92) find(str,start,end):从start开始end结束寻找与str相匹配的字符,找到返回匹配项index,找不到返回-1 a='With a moo-moo here. and a moo-moo there'.find('moo',7) >>> print(a) 7 >>> a='With a moo-moo here. and a moo-moo there'.find('moo',1,8) >>> print(a) -1 join():在字符序列之间加入分隔符 >>> seq = ['1','2','3','4','5'] >>> sep '+' >>> sep.join(seq) '1+2+3+4+5' lower():全部转为小写 >>> 'ZDF'.lower() 'zdf' title():首字母大写 >>> 'zdf'.title() 'Zdf' replace(oldstr , newstr):替换字符 >>> 'zdf is a clever boy!'.replace('clever','handsome') 'zdf is a handsome boy!' split(/PATTERN):以模式来分割,模式的意思就是REGEX >>> 'zdf+zdf+zdf'.split('+') ['zdf', 'zdf', 'zdf'] strip():去除两侧空格(不包括内部的) >>> ' zdf '.strip() 'zdf' strip('*'):也可指定去除两侧特定的字符 ,如* >>> '*********zdf****************'.strip('*') 'zdf'

优秀的个人博客,低调大师

Shell脚本-控制多主机操作

环境介绍 首先要做到各个主机之间无密ssh连接。这样会最大可能方便的控制。 脚本 命名为status #!/bin/bash params=$@ i=166 for((i=166;i<=169;i++));do echo -------s$i $params ------- ssh s$i "$params" done 测试 [root@s166 bin]# status java -version -------s166 java -version ------- bash: java: command not found -------s167 java -version ------- bash: java: command not found -------s168 java -version ------- bash: java: command not found -------s169 java -version ------- bash: java: command not found What?就给我看这个,它找不到这个命令,那我把它放到/usr/local/bin下 [root@s166 bin]# which java /home/fantj/jdk/bin/java [root@s166 bin]# ln -s /home/fantj/jdk/bin/java java javadoc javah javapackager javaws javac javafxpackager javap java-rmi.cgi [root@s166 bin]# ln -s /home/fantj/jdk/bin/java ./java [root@s166 bin]# ls java jps status xcall.sh [root@s166 bin]# status java -version -------s166 java -version ------- java version "1.8.0_171" Java(TM) SE Runtime Environment (build 1.8.0_171-b11) Java HotSpot(TM) 64-Bit Server VM (build 25.171-b11, mixed mode) -------s167 java -version ------- bash: java: command not found -------s168 java -version ------- bash: java: command not found -------s169 java -version ------- bash: java: command not found 好了,jps同理,我们只需要把命令创建软连接到/usr/local/bin下即可,每个主机都需要设置的。 效果 [root@s166 bin]# status jps -------s166 jps ------- 12641 Jps 1397 NameNode 1559 SecondaryNameNode 1727 ResourceManager -------s167 jps ------- 1764 DataNode 11610 Jps 1823 NodeManager -------s168 jps ------- 11572 Jps 1815 NodeManager 1756 DataNode -------s169 jps ------- 1813 NodeManager 1754 DataNode 11548 Jps [root@s166 bin]# status ls ~/.ssh -------s166 ls /root/.ssh ------- authorized_keys id_rsa id_rsa.pub known_hosts -------s167 ls /root/.ssh ------- authorized_keys id_rsa id_rsa.pub known_hosts -------s168 ls /root/.ssh ------- authorized_keys id_rsa id_rsa.pub -------s169 ls /root/.ssh ------- authorized_keys id_rsa id_rsa.pub

优秀的个人博客,低调大师

Python常见数据框操作①

import numpy as np import pandas as pd from pandas import Sereis, DataFrame ser = Series(np.arange(3.)) data = DataFrame(np.arange(16).reshape(4,4),index=list('abcd'),columns=list('wxyz')) data['w'] #选择表格中的'w'列,使用类字典属性,返回的是Series类型 data.w #选择表格中的'w'列,使用点属性,返回的是Series类型 data[['w']] #选择表格中的'w'列,返回的是DataFrame类型 data[['w','z']] #选择表格中的'w'、'z'列 data[0:2] #返回第1行到第2行的所有行,前闭后开,包括前不包括后 data[1:2] #返回第2行,从0计,返回的是单行,通过有前后值的索引形式 如果采用data[1]则报错 data.ix[1:2] #返回第2行的第三种方法,返回的是DataFrame,跟data[1:2]同 data['a':'b'] #利用index值进行切片,返回的是**前闭后闭**的DataFrame 即末端是包含的 data.irow(0) #取data的第一行 data.icol(0) #取data的第一列 data.head() #返回data的前几行数据,默认为前五行,需要前十行则data.head(10) data.tail() #返回data的后几行数据,默认为后五行,需要后十行则data.tail(10) ser.iget_value(0) #选取ser序列中的第一个 ser.iget_value(-1) #选取ser序列中的最后一个,这种轴索引包含索引器的series不能采用ser[-1]去获取最后一个,这会引起歧义。 data.iloc[-1] #选取DataFrame最后一行,返回的是Series data.iloc[-1:] #选取DataFrame最后一行,返回的是DataFrame data.loc['a',['w','x']] #返回‘a’行'w'、'x'列,这种用于选取行索引列索引已知 data.iat[1,1] #选取第二行第二列,用于已知行、列位置的选取。

优秀的个人博客,低调大师

【入门指南】操作阿里云Kibana

Elastic公司的“ELK”是目前最火的日志分析三剑客,其中ElasticSearch负责日志的索引,Logstash负责日志的收集,Kibana负责日志的展示和分析。事实上并不局限于日志分析,ELK技术栈同样适用于通用的数据采集、索引、分析业务,不可谓不强大。 Elastic与阿里云达成了合作伙伴关系,推出“阿里云 Elasticsearch”服务,提供了开箱即用的Elasticsearch和Kibana环境,方便我们快速搭建数据分析平台。下面我们将手把手演示一下如何在阿里云上创建并使用ElasticSearch服务。 首先,我们创建阿里云Elasticsearch服务,阿里云提供了一个月的免费体验服务。如图,选择自己服务器所在的区域、VPC以及下面的虚拟交换机。对于大规模集群,可以勾选dedicated master,专用主节点

资源下载

更多资源
Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册