Python参数化,函数调用中的参数太多Excel里数字时报错:TypeError: object of type 'float' has no len()请问要怎么解决

python调用MATLAB函数
MALTAB无比强大,python简洁高效,使用python调用MATLAB里的函数,更是使其在数值计算的开发效率有了巨大的提升。
&这篇论文中介绍了几种python调用MATLAB的几种方法。我试了一下其中的一个例子:
首先在建一个m文件,名为test.m,为一个MATLAB函数,其内容如下:
function test(M,N)
y = [sin(x)];
在使用python调用此函数之前,需要为python安装pywin32模块,此模块可从以下地址下载:
下载时注意你的python版本。
接下来在调用test函数
from win32com.client import Dispatch
h = Dispatch("Matlab.application")#启动MATLAB自动化服务器
h.execute("test(0.0,512.0)")
此时MALTAB会打开MATLAB Command Window,而且python的结果很可能为如下错误提示
“??? Undefined function or method 'test' for input arguments of
type 'double'.”
这是因为路径的原因造成的。把你的.m文件和.py放在同一路径下,在MATLAB Command
Window中cd到此路径,再执行,就会成功调用test函数,绘出正确的图形。
Vim,Python,Matlab之间有6=3*2中关系。我们这里只说,vim调Python, vim调matlab,
python调matlab三种情况。vim可以编辑.py,和.m文件,也有语法高亮。如果能在编辑完文档后按个什么键,就能执行程序是在好不过的了。matlab强是强在科学计算,矩阵计算,但是它的数据结构很单一,字符串处理上稍显不足。因此python调用matlab的情况也是有可能的。python毕竟是一样很强大的语言。(官网上通篇英语,确有两个汉字“下载”)!
1. Vim调用Python
从最简单的说吧。vim执行python代码,极其简单。
:py+{python代码},执行python2的代码。(+与{}不用输入)
:py3+{python代码},执行python3的代码。(+与{}不用输入)这种方式适合写只有一行的代码,也非常适合在编写vim插件时引用python代码。
:pyfile+{xxx.py}, 执行python的代码,代码写在文件中。(+与{}不用输入)
:py3file+{xxx.py}, 执行python3的代码。(+与{}不用输入)
因此,编译当前的.py文件只需要输入:py3file+文件名
即可。每次打这几个字也挺反的,统一起见就用“,r”来执行代码。(和中提到的用vim编译tex时的按键设成一样)代码如下:
&&/SPAN&buffer& ,r :w&&/SPAN&CR&:py3file %&&/SPAN&CR&&&/SPAN&silent&&&/SPAN&buffer&&&/SPAN&cr&&&/SPAN&cr&&/&/SPAN&cr&&/&/SPAN&cr&&/&/SPAN&buffer&&/&/SPAN&silent&
存在$vim\vimfiles\ftplugin\python.vim中,这其实就是filetype-plugin,因此打开.py以后按“,r”和打开.tex以后按“,r”,执行的代码是不同的。代码中%表示的就是现在编辑的文件的完整路径。表示回车。这里其实有两个命令,保存和编译。
2. Python调用Matlab
在这里,我们要用到matlab的com。所以Python需要用到win32com.client模块。木有的话,就要下载一下了。(我用的是python
3,谢天谢地,这个模块在3里也能用)。我们这里举一个简单的例子。
import win32com.client
h=win32com.client.GetActiveObject('matlab.desktop.application')
h=win32com.client.Dispatch('matlab.desktop.application')
h.Execute("f=8;")
print(h.GetVariable("f","base")
这个地方try和catch的作用主要是,如果已经有了一个matlab的server的话,就去用那个Server。'matlab.desktop.application'这里主要是开matlab的完整版窗口。如果不想开完整版,可以用'matlab.application'开command
window。这里有一个问题。如果你是先通过双击桌面上的图标开matlab的话,在执行这个程序会在开一个窗口。
其实,python不光可以连matlab,用这种方法,word,ie,excel,access,iTunes统统可以连接。代码中h的方法,是需要到matlab里查的。所以如果你连到word,ie,excel,access的话,你要到微软家去查了。我这里用了两个方法,一个是Execute,顾名思义,就是执行代码的。另一个是GetVariable,是可以进行数据传输的,实行数据传输的含有其他函数,比如GetFullMatrix,PutFullMatrix等等。
如何用python调用.m文件,请看下节。
3. Vim调用Matlab
Vim调用.m文件,本质上就是用Python调用.m文件的。代码如下:
function! RunMatlab()
py3 && EOF
import win32com.client
h=win32com.client.GetActiveObject('matlab.desktop.application')
h=win32com.client.Dispatch('matlab.desktop.application')
import vim
h.Execute("temppath='"+vim.eval('expand("%:p:h")')+"'")
h.Execute("cd(temppath)")
h.Execute("clear temppath")
h.Execute("rehash path")
print (h.Execute(vim.eval('expand("%:t:r")')))
endfunction
if has("win32") && has("python3")
&&/SPAN&buffer& ,r :w&&/SPAN&CR&:call RunMatlab()
和前面一样用",r"调用函数。先保存在编译。由于是vim插件,所以用py3 && EOF
{我的代码}EOF来执行多行python代码。注意第二个EOF前面不能有缩进。里面的python语句和上一节的差不多。不过在执行代码前,先修改了一下matlab的路径。在vim中执行python代码,可以用vim模块。vim.eval_r('expand("%:p:h")')就是输出当前编辑的文件所在文件夹的路径。
h.Execute("rehash
path")这句话一开始,我没有加。结果导致了什么呢?就是当我修改了.m文件,再次编译时,matlab执行的仍旧是修改以前的代码。一开始我感到什么诡异,会不会是没保存呢?可是“,r”的第一个动作就是保存。后来才知道,要让matlab里的path
refresh一下。
(h.Execute(vim.eval_r('expand("%:t:r")')))。这样,就可以在VIm里面直接查看结果了。包括错误信息。
保存在$vim\vimfiles\ftplugin\matlab.vim中。当然这个代码的先决条件是要装了python3,python2也可以,只要把py3改成py就可以了。
python模块:win32com用法详解
3人收藏此文章,&发表于10个月前( 10:30) ,
已有2429次阅读
,共个评论
python模块:win32com用法详解
import win32com
from win32com.client import Dispatch, constants
w = win32com.client.Dispatch('Word.Application')
# 或者使用下面的方法,使用启动独立的进程:
# w = win32com.client.DispatchEx('Word.Application')
# 后台运行,不显示,不警告
w.Visible = 0
w.DisplayAlerts = 0
# 打开新的文件
doc = w.Documents.Open( FileName = filenamein )
# worddoc = w.Documents.Add() # 创建新的文档
# 插入文字
myRange = doc.Range(0,0)
myRange.InsertBefore('Hello from Python!')
# 使用样式
wordSel = myRange.Select()
wordSel.Style = constants.wdStyleHeading1
# 正文文字替换
w.Selection.Find.ClearFormatting()
w.Selection.Find.Replacement.ClearFormatting()
w.Selection.Find.Execute(OldStr, False, False, False, False, False,
True, 1, True, NewStr, 2)
# 页眉文字替换
w.ActiveDocument.Sections[0].Headers[0].Range.Find.ClearFormatting()
w.ActiveDocument.Sections[0].Headers[0].Range.Find.Replacement.ClearFormatting()
w.ActiveDocument.Sections[0].Headers[0].Range.Find.Execute(OldStr,
False, False, False, False, False, True, 1, False, NewStr, 2)
# 表格操作
doc.Tables[0].Rows[0].Cells[0].Range.Text ='123123'
worddoc.Tables[0].Rows.Add() # 增加一行
# 转换为html
wc = win32com.client.constants
w.ActiveDocument.WebOptions.RelyOnCSS = 1
w.ActiveDocument.WebOptions.OptimizeForBrowser = 1
w.ActiveDocument.WebOptions.BrowserLevel = 0 #
constants.wdBrowserLevelV4
w.ActiveDocument.WebOptions.OrganizeInFolder = 0
w.ActiveDocument.WebOptions.UseLongFileNames = 1
w.ActiveDocument.WebOptions.RelyOnVML = 0
w.ActiveDocument.WebOptions.AllowPNG = 1
w.ActiveDocument.SaveAs( FileName = filenameout, FileFormat =
wc.wdFormatHTML )
doc.PrintOut()
# doc.Close()
w.Documents.Close(wc.wdDoNotSaveChanges)
(3)处理excel
[1]使用PyExcelerator读写EXCEL文件(Platform:
Win,Unix-like)&
优点:简单易用&&&&&
缺点:不可改变已存在的EXCEL文件。&
PyExcelerator是一个开源的MS Excel文件处理python包。它主要是用来写
Excel&文件.URL:&
http://sourceforge.net/projects/pyexcelerator/&
我没有找到关于PyExcelerator的文档。只是看到了limodou的一篇介绍。&
http://blog.donews.com/limodou/archive//460033.aspx&
这个包使用起来还是比较简单的:)。带了很多小例子,可以参照。&
例mini.py.&
=================================&
#!/usr/bin/env&python&
# -*- coding: windows-1251 -*-&
# Copyright (C) 2005 Kiseliov
__rev_id__ = """$Id: mini.py,v 1.3
12:47:06 rvk Exp
"导入模块&
from pyExcelerator import *&
"生成一个工作薄&
w = Workbook()&
"加入一个Sheet&
ws = w.add_sheet('Hey, Dude')&
w.save('mini.xls')&
=================================&
[2]使用COM接口,直接操作EXCEL(只能在Win上)&
优点:可以满足绝大数要求。缺点:有些麻烦。:-)&
这方面的例子很多,GOOGLE 看吧:-). 文档也可以参看OFFICE自带的VBA EXCEL 帮助文件(VBAXL.CHM)。这里面讲述了EXCEL
VBA的编程概念,&
不错的教程!另外,《Python&Programming
Win32》书中也有很详细的介绍。这本书中给出了一个类来操作EXCEL&文件,可以很容易的加以扩展。&
#!/usr/bin/env&python&
# -*- coding: utf-8 -*-&
from win32com.client import
import win32com.client&
class easyExcel:&
&&& """A utility
to make it easier to get at Excel.&
Remembering&
&&& to save the
data is your problem, as is& error
handling.&
&&& Operates on
one workbook at a time."""&
__init__(self, filename=None):&
self.xlApp =
win32com.client.Dispatch('Excel.Application')&
if filename:&
&&&&&&&&&&&
self.filename = filename&
&&&&&&&&&&&
self.xlBook =
self.xlApp.Workbooks.Open(filename)&
&&&&&&&&&&&
self.xlBook =
self.xlApp.Workbooks.Add()&
&&&&&&&&&&&
self.filename =
save(self, newfilename=None):&
if newfilename:&
&&&&&&&&&&&
self.filename = newfilename&
&&&&&&&&&&&
self.xlBook.SaveAs(newfilename)&
&&&&&&&&&&&
self.xlBook.Save()&&&&
close(self):&
self.xlBook.Close(SaveChanges=0)&
del self.xlApp&
getCell(self, sheet, row, col):&
"Get value of one cell"&
self.xlBook.Worksheets(sheet)&
return sht.Cells(row, col).Value&
setCell(self, sheet, row, col,
"set value of one cell"&
self.xlBook.Worksheets(sheet)&
sht.Cells(row, col).Value =
getRange(self, sheet, row1, col1, row2,
"return a 2d array (i.e. tuple of
self.xlBook.Worksheets(sheet)&
return sht.Range(sht.Cells(row1, col1), sht.Cells(row2,
col2)).Value&
addPicture(self, sheet, pictureName, Left, Top, Width,
"Insert a picture in sheet"&
self.xlBook.Worksheets(sheet)&
sht.Shapes.AddPicture(pictureName, 1, 1, Left, Top, Width,
cpSheet(self, before):&
"copy sheet"&
shts = self.xlBook.Worksheets&
shts(1).Copy(None,shts(1))&
"下面是一些测试代码。&
if __name__ == "__main__":&
&&& PNFILE =
r'c:\screenshot.bmp'&
easyExcel(r'D:\test.xls')&
xls.addPicture('Sheet1', PNFILE,
xls.cpSheet('Sheet1')&
xls.save()&
xls.close()
(4)python调用短信猫控件,发短信
#! /usr/bin/env python
#coding=gbk
import sys
import win32com.client
ocxname='ShouYan_SmsGate61.Smsgate'
axocx=win32com.client.Dispatch(ocxname)
axocx.CommPort=8#设置COM端口号
axocx.SmsService='+0'#设置短信服务号码
axocx.Settings='9600,n,8,1'#设置com端口速度
axocx.sn='loyin'
c=axocx.Connect(1)#连接短信猫或手机
print '连接情况',axocx.Link()
axocx.SendSms('python确实是很好的','',0)#发送短信
Jay ("pyt...@gmail.com)
10, :43 am
com.googlegroups.python-cn
Frank Zhao &&SPAN&fran...@gmail.com&
各位大神: 小弟初学python,大半年了。能python进行一些简单操作。
目前有几个问题: 1. 我想用python调用其他windows程序。例如GIF
gear。QQ音乐等等。看到了一些书里面提到可以使用win32com.client.Dispatch("Word.Application")调用word进行的一些操作。我的问题是当我调用其他程序时,我怎么知道该程序的名字?win32com.client.Dispatch(要调用程序的名字?)
2. 当我知道我要调用程序的名字后:win32com.client.Dispatch(要调用程序的名字?),我怎么调用该程序的菜单来完成我希望的操作。
谢谢大家!
win32com.client.Dispatch是用来创建COM对象的,你得先看看你想要控制的软件的文档,它们有没有提供对应的COM服务,如果有的话,你才能用win32com.client.Dispatch
来控制这些软件,但很有可能是没有提供这些服务的。这个时候,你可以考虑使用autoit模拟鼠标和键盘来控制这些软件。
autoit提供了COM服务,所以你可以直接写autoit的脚本来控制,也可以用python写代码通过COM调用autoit来控制。
autoit官方网站在这:
不过好像被墙了,你得翻墙。
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。python及后端(69)
返回一个数字的绝对值。参数可能是整数或浮点数。如果参数是一个复数,则返回其大小。
In [33]: abs(-1)
Out[33]: 1
all(iterable)
如果的所有元素迭代是真实的(或者如果可迭代为空)返回True。相当于:
def all(iterable):
for element in iterable:
if not element:
return False
return True
In [30]: all([1,2,3])
Out[30]: True
In [31]: all([1,2,False])
Out[31]: False
In [32]: all([])
Out[32]: True
ascii(object)
这个函数跟repr()函数一样,返回一个可打印的对象字符串方式表示。当遇到非ASCII码时,就会输出\x,\u或\U等字符来表示。与Python 2版本里的repr()是等效的函数。
In [34]: print(ascii(10), ascii(9000000), ascii('b\31'), ascii('0x\1000'))
10 9000000 'b\x19' '0x@0'
In [35]: type(ascii(10))
Out[35]: str
将整数转换为以“0b”为前缀的二进制字符串。结果是一个有效的Python表达式。
In [36]: bin(3)
Out[36]: '0b11'
In [37]: type(bin(3))
Out[37]: str
In [38]: bin(-10)
Out[38]: '-0b1010'
In [39]: type(bin(-10))
Out[39]: str
bool([ x ] )
返回一个布尔值,即一个True或False。 如果x为假或者省略,则返回F 否则返回True。
bool类是int类的子类。
In [40]: bool()
Out[40]: False
In [41]: bool([])
Out[41]: False
In [42]: bool([1,2])
Out[42]: True
In [43]: bool(1)
Out[43]: True
In [44]: bool(0)
Out[44]: False
bytearray([source [, encoding [, errors]]])
A bytearray与普通的python字符串非常相似(str在python2.x中,bytes在python3中),但有一个重要的区别,而字符串是不可变的,bytearrays是可变的,有点像list单个字符串。
这是有用的,因为一些应用程序使用不可变字符串执行较差的字节序列。如果在数据库引擎或图像库中,在大块内存中进行大量小改动,则字符串性能会很差;
因为你必须复制整个(可能是大的)字符串。
bytearray它的优点是可以在不复制记忆的情况下做出这种改变。
但是这个特例实际上更多的是例外,而不是规则。大多数用途涉及比较字符串或字符串格式。对于后者,无论如何通常都有一个副本,所以可变类型不会提供任何优势。对于前者,由于不可变的字符串不能更改,因此可以计算一个hash字符串,并将其作为比较每个字节顺序的快捷方式,这几乎总是一个很大的胜利;
所以它是不可变的类型(str或bytes),这是默认的; 并且bytearray是例外,当你需要它的特殊功能。
中文说明:
bytearray([source [, encoding [, errors]]])返回一个byte数组。Bytearray类型是一个可变的序列,并且序列中的元素的取值范围为 [0 ,255]。
参数source:
如果source为整数,则返回一个长度为source的初始化数组;
如果source为字符串,则按照指定的encoding将字符串转换为字节序列;
如果source为可迭代类型,则元素必须为[0 ,255]中的整数;
如果source为与buffer接口一致的对象,则此对象也可以被用于初始化bytearray.。
版本:在python2.6后新引入,在python3中同样可以使用!
In [45]: bytearray()
Out[45]: bytearray(b'')
In [46]: a = bytearray(3)
In [47]: a
Out[47]: bytearray(b'\x00\x00\x00')
In [48]: a[0]
Out[48]: 0
In [49]: a[1]
Out[49]: 0
In [50]: a[2]
Out[50]: 0
In [51]: b = bytearray("abc")
Traceback (most recent call last)
&ipython-input-51-f477c68d28a2& in &module&()
TypeError: string argument without an encoding
In [52]: b = bytearray("abc", encoding='utf-8')
In [53]: b
Out[53]: bytearray(b'abc')
In [54]: b[0]
Out[54]: 97
In [55]: b[1]
Out[55]: 98
In [56]: b[2]
Out[56]: 99
In [57]: c = bytearray([1,2,3])
In [58]: c[0]
Out[58]: 1
In [59]: c[1]
Out[59]: 2
In [60]: c[2]
Out[60]: 3
In [61]: d = bytearray(buffer("abc"))
Traceback (most recent call last)
&ipython-input-61-40665c074d88& in &module&()
NameError: name 'buffer' is not defined
bytes([source[, encoding[, errors]]])
返回一个“bytes”对象, 是一个范围在0 &= x & 256的一个不变的整数序列。bytes 是一个不可变版本的 bytearray – 它具有相同的非变异方法和相同的索引和切片行为。
Python 3 特有的,Python2是不区分bytes和str。
bytes是不可变的。
Python 2 中:
type(b'xxxx')
&type 'str'&
&&& type('xxxx')
&type 'str'&
Python 3 中:
In [1]: type(b'xxxx')
Out[1]: bytes
In [3]: type('xxxx')
Out[3]: str
bytes 和 str 的区别在于,bytes是byte的序列,而str是unicode的序列。
str可使用encode的方法转化为bytes。
bytes使用decode的方法转化为str。
(默认的encode和decode的编码方式为utf-8)。
In [4]: s = '于龙君'
In [5]: b = s.encode()
Out[6]: b'\xe4\xba\x8e\xe9\xbe\x99\xe5\x90\x9b'
In [7]: b.decode()
Out[7]: '于龙君'
In [8]: for x in s:
In [9]: for x in b:
bytearray和bytes不一样的地方在于,bytearray是可变的。
In [10]: s = '于龙君'
In [11]: ba = bytearray(s.encode())
In [12]: ba
Out[12]: bytearray(b'\xe4\xba\x8e\xe9\xbe\x99\xe5\x90\x9b')
In [13]: ba.decode()
Out[13]: '于龙君'
In [14]: ba[:3] = bytearray('王'.encode())
In [15]: ba
Out[16]: bytearray(b'\xe7\x8e\x8b\xe9\xbe\x99\xe5\x90\x9b')
In [17]: ba.decode()
Out[17]: '王龙君'
callable(object)
中文说明:检查对象object是否可调用。如果返回True,object仍然可能调用失败;但如果返回False,调用对象ojbect绝对不会成功。
注意:类是可调用的,而类的实例实现了__call__()方法才可调用。
版本:该函数在python2.x版本中都可用。但是在python3.0版本中被移除,而在python3.2以后版本中被重新添加。
In [15]: callable(0)
Out[15]: False
In [16]: callable("my_string")
Out[16]: False
In [17]: def add(a,b):
return a+b
In [18]: callable(add)
Out[18]: True
In [19]: class A:
def method(self):
In [20]: callable(A)
Out[20]: True
In [21]: a = A()
In [23]: callable(a)
Out[23]: False
In [24]: class B():
def __call__(self):
In [25]: callable(B)
Out[25]: True
In [27]: b = B()
In [28]: callable(b)
Out[28]: True
cmp(x,y )(python3去除)
中文说明:比较两个对象x和y,如果x & y ,返回负数;x == y, 返回0;x & y,返回正数。
版本:该函数只有在python2中可用,而且在python2所有版本中都可用。但是在python3中该函数已经被删减掉,这点要特别注意。
Python 2.7.14 (v2.7.14:ed, Sep 16 2017, 20:25:58) [MSC v.1500 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
&&& cmp(1,2)
&&& exit()
Python 3.6.3 (v3.6.3:2c5fed8, Oct
3 2017, 18:11:49) [MSC v.1900 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
&&& cmp(1,2)
Traceback (most recent call last):
File "&stdin&", line 1, in &module&
NameError: name 'cmp' is not defined
compile(source, filename, mode[, flags[, dont_inherit]])
中文说明:将source编译为代码或者AST对象。代码对象能够通过exec语句来执行或者eval()进行求值。
参数source:字符串或者AST(Abstract Syntax Trees)对象。
参数 filename:代码文件名称,如果不是从文件读取代码则传递一些可辨认的值。
参数model:指定编译代码的种类。可以指定为 ‘exec’,’eval’,’single’。
参数flag和dont_inherit:这两个参数暂不介绍,可选参数。
版本:在python2.3、2.6、2.7、3.2中均有不同,使用时要引起注意,兼容python3
&&& code = "for i in range(0, 10): print(i)"
&&& code = compile(code, '', 'exec')
&&& exec(code)
&&& str = "3 * 4 + 5"
&&& a = compile(str,'','eval')
&&& eval(a)
complex([real[, imag]])
中文说明:
创建一个值为real + imag * j的复数或者转化一个字符串或数为复数。如果第一个参数为字符串,则不需要指定第二个参数。
参数real: int, long, float或字符串;
参数imag: int, long, float。
&&& complex(1, 2)
&&& complex(1)
&&& complex("1")
&&& complex("1+2j")
替换cmp的新函数
&&& import operator
&&& a ,b = 0,1
&&& operator.lt(a,b)
&&& operator.le(a,b)
&&& operator.eq(a,b)
&&& operator.ne(a,b)
&&& operator.ge(a,b)
&&& operator.gt(a,b)
operator.__lt__(a, b)
operator.__le__(a, b)
operator.__eq__(a, b)
operator.__ne__(a, b)
operator.__ge__(a, b)
operator.__gt__(a, b)
lt(a, b) 相当于 a & b
le(a,b) 相当于 a &= b
eq(a,b) 相当于 a == b
ne(a,b) 相当于 a != b
gt(a,b) 相当于 a & b
ge(a, b)相当于 a&= b拒绝访问 | www.th7.cn | 百度云加速
请打开cookies.
此网站 (www.th7.cn) 的管理员禁止了您的访问。原因是您的访问包含了非浏览器特征(e43b3-ua98).
重新安装浏览器,或使用别的浏览器

我要回帖

更多关于 vue 调用接口并传参数 的文章

 

随机推荐