python定义函数怎么调用函数

python中根据字符串调用函数的实现方法
转载 & & 投稿:jingxian
下面小编就为大家带来一篇python中根据字符串调用函数的实现方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考,一起跟随小编过来看看吧
在python中可以根据字符串来调用函数:
1、使用getattr从字符串来调用函数
在多进程中,可能传递过来的是一个字符串,那么我怎么来调用一个已经存在的函数呢,主要就是使用到getattr函数的作用,这个函数就是在使用字符串得到这个字符串对应的函数的对象,然后就可以进行执行,如下所示:
在模块中,存在两个函数:
[root@python 530]# cat attr.py
#!/usr/bin/env python
def kel():
print 'this is a kel function'
def smile():
print 'this is a smile function'
if __name__ == '__main__':
在上面的attr模块中,定义了两个函数,一个函数为kel,另外一个函数为smile,那么我根据字符串kel和smile怎么执行函数呢,就是使用getattr函数,如下所示:
&&& import attr
&&& k = getattr(attr,'kel')
this is a kel function
&&& s = getattr(attr,'smile')
this is a smile function
&&& e = getattr(attr,'errors')
Traceback (most recent call last):
File "&stdin&", line 1, in &module&
AttributeError: 'module' object has no attribute 'errors'
在第一个中,直接导入模块,那么模块就是一个object,从而在getattr根据字符串kel获取到attr中的kel()函数,从而最后进行执行,这里也就实现了,根据字符串的不同,从而执行相应的函数。
2、 使用字典来调用函数
在上面模块的定义不变,但是在调用的时候,可以定义一个字典,根据字典的值来进行执行函数,如下所示:
&&& import attr
&&& d = {'kel':attr.kel,'smile':attr.smile}
&&& d['kel']()
this is a kel function
&&& d['smile']()
this is a smile function
从而可以使用字典值来进行调用函数。
以上两种方法主要就是用来,当传递过来一个字符串的时候,我该如何调用其他函数,那么第一种方法就是使用getattr来进行执行函数;第二种方法就是预先定义一个字典,然后执行字典的值即可。
以上这篇python中根据字符串调用函数的实现方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具Python 为什么要使用函数嵌套函数
17:47:47 +08:00 · 3094 次点击
看一些代码会写成函数中嵌套函数,例如:
def func():
def new_func():
a = new_func()
这种写法和 lambda 和单独创建一个 function 有什么区别或优势吗?
21 回复 &| &直到
22:02:19 +08:00
& & 17:52:17 +08:00
& & 17:54:57 +08:00
对啊,要写闭包的时候很好用的
& & 18:03:54 +08:00
查看一下柯里化的定义,这样写返回的新函数能够保持当时的状态,而且能够达到惰性求值的效果(用到这个函数的时候再处理传入的参数)
& & 18:07:03 +08:00
例如装饰器传参,就是多层嵌套的函数,
& & 18:18:23 +08:00
因为 lambda 的限制
& & 21:07:01 +08:00
你的例子确实 lambda 也可以做到。但是下面的呢?
def func(x):
def new_func(y):
return x+y
return new_func
&&& a = func(10)
&&& a(3)
13
&&& a(5)
15
& & 22:27:16 +08:00 via Android
也许是为了方便吧。脚本嘛
& & 22:48:30 +08:00
额,其实我也不是很了解这两种用法的差异的,不过一不小心就写了出来 @
In [1]: def func(x):
return lambda y:y+x
In [2]: a = func(10)
In [3]: a(3)
Out[3]: 13
In [4]: a(5)
Out[4]: 15
& & 22:57:23 +08:00
@ 你的例子不合适啊。
&&& a = lambda x: lambda y: x + y
&&& b = a(10)
&&& b(3)
13
&&& b(5)
15
& & 23:08:38 +08:00
因为 lambda 是匿名的,我想区别应该是名字是否有意义,比如递归吧。
&&& def func(x, sum):
...
if(x==0):
...
return sum
...
return func(x-1, sum + x)
...
&&& func(10, 0)
55
lambda 大概写不出上面这个递归?
& & 23:35:47 +08:00 via Android
能省几个参数,函数的作用域小了
& & 00:08:01 +08:00 via Android
一般是返回一个函数指针时用。一般外部固定了函数指针的参数,但是自己又需要传递给函数指针一些数据,这样嵌套函数可以使得内部函数可以访问外部函数的变量。关键字:闭包,需求的例子:装饰器。
不用 lambda 的原因是 lambda 限制太大,不方便。
& & 08:29:38 +08:00
这就是 meta 编程啊
& & 09:14:42 +08:00
lambda 你能多写几行么
& & 09:44:52 +08:00 via Android
Python 里 lambda 只能写一行啊
& & 10:14:32 +08:00
需要做到这个的话直接用指针不行吗?
& & 10:30:52 +08:00
@ 无法实现,像下面的装饰器例子:
&显示 Gist 代码&
需要将 @(123) 的 123 传递给 fffff 函数,但是 fffff 函数是会被当作 hello3 参数给用户调用的,用户不会帮你把 123 传递进去,只能通过闭包的方式传递进去 123 .
& & 10:35:18 +08:00
lambda 写复杂的函数很麻烦啊
& & 13:55:52 +08:00
这是一种嵌套函数的写法,有时候它和 lambda 没什么区别,但有些情况下它会实现一个闭包,所以我姑且认为楼主是想知道闭包的特性.
那么这里首先强烈建议楼主了解一下 namespace 与变量作用域的相关知识.
如果只要了解闭包的概念,请参考这篇文章.
如果想知道闭包的实现原理.那么你必须得明白函数调用过程.因为闭包本身就是调用一个函数反回另一个函数.
这里推荐 UCSB 的教程,提供了一个交互式的函数调用演示程序.共6个课程,每个课程都很短,但看完这些你大概能对函数调用帧栈有初步了解.
到现在你已经可以开始探究 python 在函数调用中如何精妙地完成参数传递.
如果能坚持到这里,那么你已经停不下来了...函数调用过程中所有涉及到的源码作者都给出了分析,看完之后应该什么都明白了
以下链接可以看看,也许能帮助你理解源码.
& & 14:16:47 +08:00
一种劣习,让函数变成有状态的,或者叫不完全依赖于字面输入,还依赖一个隐藏输入的东西
& &82 天前
我用这个是因为 有时候要用递归,把 helper 放函数里面可以把外面函数的变量当全局变量。
另外就是 helper 只用这里会用,写外面不清晰。
& · & 1686 人在线 & 最高记录 3541 & · &
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.0 · 24ms · UTC 02:53 · PVG 10:53 · LAX 19:53 · JFK 22:53? Do have faith in what you're doing.中级篇之2Python中类函数模块简单介绍和方法调用
前篇文章介绍了PyCharm的基本使用,接下来我们的脚本代码都在这个PyCharm这个编辑器里写。好处有很多,项目文件结构层次清晰,写代码的时候会自动化提示和补全。这里,我们在昨天创建的项目下,新建一个包,然后在包下面新建一个demo.py文件。抄写以下代码到你的环境里,尝试运行下,看看有没有问题。
关于Python中类和函数及方法的调用,我们写在这个demo.py文件,具体代码如下:
请点击此处输入图片描述
# coding=utf-8
class ClassA(object):
string1 = "这是一个字符串。"
def instancefunc(self):
print ('这是一个实例方法。')
print (self)
@classmethod
def classfunc(cls):
print ('这是一个类方法。')
print (cls)
@staticmethod
def staticfun():
print ('这是一个静态方法。')
test = ClassA() # 初始化一个ClasssA的对象,test是类ClassA的实例对象
test.instancefunc() # 对象调用实例方法
test.staticfun() # 对象调用静态方法
test.classfunc() # 对象调用类方法
print test.string1 # 对象调用类变量
ClassA.instancefunc(test) # 类调用实例方法,需要带参数,这里的test是一个对象参数
ClassA.instancefunc(ClassA) # 类调用实例方法,需要带参数,这里的ClassA是一个类参数
ClassA.staticfun() # 类调用静态方法
ClassA.classfunc() # 类调用类方法
先运行下代码是否会报错,然后尝试自己去理解下。主要有以下几点内容
1. 类的定义,class开头的就表示这是一个类,小括号里面的,表示这个类的父类,涉及到继承,默认object是所有类的父类。python中定义类,小括号内主要有三种:1. 具体一个父类,2. object 3. 空白
2. 函数或方法的定义, def开头就表示定义一个函数,方法包括,实例方法,类方法,静态方法,注意看类方法和静态方法定义的时候上面有一个@标记。
3. 对象调用方法和类调用方法的使用。
这篇讲的东西,确实比较难理解。如果学过Java的人,可能会好理解类和对象,以及面向对象的概念。Python同时支持面向过程变成和面向对象编程,所有python中也有类和对象等概念。一般来说,概念的东西比较绕,如果你Python基础没有看到这部分,那边请回去《看笨方法学python》中关于这块的介绍。如果有看过了,还是不理解,我只能告诉你,继续学下去,你现在哪怕死记住这些概念和他们的基本使用。等到后面,框架设计部分,你会慢慢体会到这些基本概念的实际用法,你跟着写了代码后,会有助于你自己的理解和提高。
最后,来说下python中的模块,在python中,你新建一个demo.py文件,那么一个.py文件可以说是一个模块,一个模块中,可以定义多个class,模块中也可以直接定义函数。和java一样,访问不同包下的类和方法之前,需要导入相关路径下的包。例如from selenium import webdriver 这个导入语句,我们知道webdriver这个接口是在selenium的模块下。
本篇文章的学习目的,会用函数或者类来编写我们之前写过的脚本。
以下用百度搜索举例,模仿上面用类调用实例的方法来写这个脚本,可能看起来比较啰嗦,但是代码多了,你就会体会到类的作用,注意这里self指的是当前BaiduSearch这个类本身:
请点击此处输入图片描述
# coding=utf-8
import time
from selenium import webdriver
class BaiduSearch(object):
driver = webdriver.Chrome()
driver.maximize_window()
driver.implicitly_wait(10)
def open_baidu(self):
self.driver.get("https://www.baidu.com")
time.sleep(1)
def test_search(self):
self.driver.find_element_by_id('kw').send_keys("selenium")
time.sleep(1)
print self.driver.title
assert 'selenium' in self.driver.title
print ('Test pass.')
except Exception as e:
print ('Test fail.')
self.driver.quit()
baidu = BaiduSearch()
baidu.open_baidu()
baidu.test_search()
责任编辑:
声明:本文由入驻搜狐号的作者撰写,除搜狐官方账号外,观点仅代表作者本人,不代表搜狐立场。
大型电商项目视频
凯哥java博客
今日搜狐热点29被浏览22,835分享邀请回答14添加评论分享收藏感谢收起import sys
sys.path.append(r'D:\')
import mymodule
mymodule.function()
17添加评论分享收藏感谢收起29被浏览22,835分享邀请回答2添加评论分享收藏感谢收起}

我要回帖

更多关于 python调用函数库 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信