python编写函数,要求接收字符串参数,计算出该字符串中的奇数和偶数的个数并返回。

查找文件,可使用 os.walk() 函数 ,传一个目录名给它

def test(n):

python接收外部参数 python接收输入参数python接收外部参数 python接收输入参数


python接收外部参数 python接收输入参数


调用函数时,实参默认按位置顺序传递的。同时实参个数也要和形参匹配

d={'odd':0,'n':0}

return function(args, kwargs)

if isinstance(int(n),int):

for x in str(n):

if int(x)%2==0:

d['n']+=1

else:

d['odd']+=1

return d

n=input('请输入正整数:')

print(test(n))

Python代码中func(args, kwargs)是什么意思

「你需要写一个涉及到文件查找作的脚本,比如对日志归档文件的重命名工具,你不想在 Python 脚本中调用 shell,或者你要实现一些 shell 不能做的功能。」

这是一种特殊的语法,在函数定义中使用args和kwargs传递可变长参数。args用作传递非命名键值可变长参数列表(位置参数); kwargs用作传递键值可变长参数列表。

示例 arg例子1中,连续调用addItem('world') 的结果会是s def test_var_args(farg, args):

print "formal arg:", farg

print "another arg:", arg

test_var_args(1, "two", 3)# 输出

formal arg: 1

another arg: 3示例 kwargs def test_var_kwargs(farg, kwargs):

print "formal arg:", farg

print "another keyword arg: %s: %s" % (key, kwargs[key])

formal arg: 1

class 类名: @clasod def 类方法名(cls): passanother keyword arg: myarg2: two

another keyword arg: myarg3: 3

Python的函数和参数

此外,

parameter 是函数定义的参数形式

argument 是函数调用时传入的参数实体。

对于函数调用的传参模式,一般有两种:

python的函数参数定义一般来说有五种: 位置和关键字参数混合 , 仅位置参数 , 仅关键字参数 , 可变位置参数 , 可变关键字参数 。其中仅位置参数的方首先,我们再来回顾一下,形参和实参:式仅仅是一个概念,python语法中暂时没有这样的设计。

通常我们见到的函数是位置和关键字混合的方式。

既可以用关键字又可以用位置调用

或这种方式的定义只能使用在python中,类型属于对象,变量是没有类型的,这正是python的语言特性,也是吸引着很多pythoner的一点。所有的变量都可以理解是内存中一个对象的“引用”,或者,也可以看似c中void的感觉。所以,希望大家在看到一个python变量的时候,把变量和真正的内存对象分开。关键字传参的模式

f(some_list) 与 f(arg1, arg2, ...) (其中some_list = [arg1, arg2, ...])是等价的

网络模块request的request方法的设计

有多种方法能够为函数定义输出:

非常晦涩

如果使用可变对象作为函数的默认参数,会导致默认参数在所有的函数调用中被共享。

例子1:

addItem方法的data设计了一个默认参数,使用不当会造成默认参数被共享。

python里面,函数的默认参数被存在__default__属性中,这是一个元组类型

例子2:

在例子1中,默认参数是一个列表,它是mutable的数据类型,当它写进 __defauts__属性中时,函数addItem的作并不会改变它的id,相当于 __defauts__只是保存了data的引用,对于它的内存数据并不关心,每次调用addItem,都可以修改 addItem.__defauts__中的数据,它是一个共享数据。

如果默认参数是一个imutable类型,情况将会不一样,你无法改变默认参数次存入的值。

Python中定义可变参数的形式有哪些呢?

python中使用命令行选项:

Python中定义可变参数的形式有两种:

for arg in args:

```python

def my_function(args):

print(a默认情况下, check_output() 仅仅返回输入到标准输出的值。如果你需要 同时收集标准输出和错误输出 ,使用 stderr 参数:rg)

在上面的代码中,args表示可以接收任意数量的参数,这些参数会被作为一个元组传递给my_function函数。

2. kwargs:用于将不定数量的关键字参数传递给一个函数。在函数内部,这些参数会被视为一个字典(dict)。定义方式如下:

```python

def my_function(kwargs):

for key, value in kwargs.s():

在上面的代码中,kwargs表示可以接收任意数量的关键字参数,这些参数会被作为一个字典传递给my_function函数。

这两种形式可以结合使用,如下所示:

```python

def my_function(args, kwargs):

print(arg)

for key, value in kwargs.s():

这个函数可以接收任意数量的位置参数和关键字参数,并将它们分别作为一个元组和一个字典传递给函数。

python如何运行程序并向程序传入参数?

默认情况下,对于 符号链接 这些命令处理的是它指向的东西文件。例如,如果 源文件 是一个 符号链接 ,那么目标文件将会是 符号链接 指向的文件。如果你只想 符号链接本身 ,那么需要指定 关键字 参数 follow_symlinks

参数个数使用len()函数来获取import sys print sys.argv if __name__=='__main__': print "Program name", sys.argv[0] for i in range(1, len(sys.argv)): print "arg%d"%i,sys.argv[i]

test_var_kwargs(farg=1, myarg2="two", myarg3=3)# 输出

注意多数的可选参数被设计成可变关键字参数调用的时候百必须使用

python 脚本名.py arg1 arg2

脚本名.py arg1 arg2

python中的方法怎么传入object参数

简单总结一下,谁调用函数,谁就负责传入参数。

如果想for key in kwargs:要让一个方法成为类方法我们只需要在这个方法的前面添加@clas举一个小栗子od即可,与此同时需要在方法的第1个形参位置添加cls

Linux 下Python 脚本编写的"奇技巧"

「 生命完美的,无非走过没有遗憾 ---《天蓝》」

「如何能够解析脚本运行命令行选项(位于 sys.argv 中)」

argparse 模块可被用来解析命令行选项

常用来定义一个脚本的说明文档,一般我们写python脚本会通过 if..else 的方式来提供一个脚本说明文档,python不支持switch。所以很麻烦,其实,我们可以通过 argparse 来编写说明文档。

我们来看看怎么执行一个python脚本

对于熟悉Linux的小伙伴下面的文档在熟悉不过了,这个一个标准Linxu软件包的说明文档,文档中定义是软件包的说明

来看看这个脚本是如何原以为requests请求十分强大, 但遇到了模拟multipart/form-data类型的t请求, 才发现requests库还是有一丢丢的不足。 不过也可能是我理解的不足, 还希望读者老爷不吝指教! 在此感谢!编写的

为了解析命令行选项, 首先要创建一个 ArgumentParser 实例, 使用 add_argument() 方法声明你想要支持的选项。在每个 add-argument() 调用中:

dest 参数指定解析结果被指派给属性的名字。 metar 参数被用来生成帮助信息。

action 参数 指定跟属性对应的处理逻辑,通常的 值为 store , 被用来存储 某个值 或将 多个参数值收集到一个列表中 。

nargs 参数收集 所有剩余的命令行参数到一个列表中。在本例中它被用来构造一个文件名列表

action='store_true' 根据参数是否存在来设置一个位置 Boolean 标志:

action='store' 参数接受一个单独值并将其存储为一个字符串

如果一个都没有,会提示缺少参数 -p/--pat

chos={'slow', 'fast'}, 参数说明接受一个值,但是会将其和可能的选择值做比较,以检测其合法性:

一旦参数选项被指定,你就可以执行 parser.parse() 方法了。它会处理 sys.argv 的值并返回一个结果实例。每个参数值会被设置成该实例中 add_argument() 方法的 dest 参数指定的属性值。

还很多种其他方法解析命令行选项。可以会手动地处理 sys.argv 或者使用 getopt 模块 。但是,如果你采用本节的方式,将会减少很多冗余代码,底层细节 argparse 模块 已经帮你处理好了。你可能还会碰到使用 optparse 库解析选项的代码。尽管 optparse 和 argparse 很像 ,但是后者更先进,因此在新的程序中你应该使用它。

「你写了个脚本,运行时需要一个密码。此脚本是交互式的,因此不能将密码在脚本中硬编码,而是需要弹出一个密码输入提示,让用户自己输入。」

Python 的 getpass 模块 正是你所需要的。你可以让你很轻松地弹出密码输入提示,并且不会在用户终端显示密码。

代码中 getpass.getuser() 不会弹出用户名的输入提示。它会根据该 用户的 shell 环境 或者会依据 本地系统的密码库 (支持 pwd 模块的平台)来使用 当前用户的登录名

在bash中编写pytohn脚本接收外部数据的方式,一般情况下,对于一般变量,我们用命令行变量的方式比较多(手动的处理 sys.argv ),对于 文件内容或者bash命令输出 直接通过脚本内部获取需要的数据。

其实python 脚本也可以用其他方式来接收 传递给他的 文件数据或者bash命令输出 ,包括将 命令行的输出 通过 管道传递 给该脚本、 重定向文件到该脚本 ,或在 命令行中传递一个文件名 或 文件名列表 给该脚本。

这里通过 Python 内置的 fileinput 模块 ,可以实现重 定向,管道,以文佳输出 的方式传递数据到脚本内部

文件直接接收

重定向接收

管道方式接收

fileinput.input() 创建并返回一个 FileInput 类的实例,该实例可以被当做一个 上下文管理器 使用。因此,整合起来,如果我们要写一个打印多个文件输出的脚本,那么我们需要在输出中包含文件名和行号

使用 subprocess.check_output() 函数。

执行下试试

如果被执行的命令以非零码返回,就会抛出异常。下面的例子捕获到错误并获取返回码:

如果你需要用一个超时机制来执行命令,使用 timeout 参数:

通常来讲,命令的执行 不需要 使用到 底层 shell 环境(比如 sh、bash) 。一个字符串列表会被传递给一个 低级系统命令 ,比如 os.execve() 。

如果你想让 命令被一个shell 执行 ,传递一个字符串参数,并设置参数 shell=True . 有时候你想要 Python 去执行一个复杂的 shell 命令 的时候这个就很有用了,比如管道流、I/O 重定向和其他特性。例如:

是在 shell 中执行命令会存在一定的安全风险,特别是当参数来自于用户输入时。这时候可以使用 shlex.quote() 函数 来将参数正确的用双引用引起来。

关于子进程,简单来看下

也可以进程列表同协程结合的方式。你既可以在子shell中 进行繁重的处理工作,同时也不会让子shell的I/O受制于终端。

如果直接丢到后台会自动在终端输出IO

subprocess 模块对于依赖 TTY 的外部命令不合适用 。例如,你不能使用它来自动化一个用户输入密码的任务(比如一个 ssh 会话)。这时候,你需要使用到第三方模块了,比如基于的 expect 家族的工具(pexpect 或类似的)(pexpect可以理解为Linux下的expect的Python封装、通过pexpect可以实现对ssh、ftp、passwd、net等命令行进行自动交互,而无需人工干涉来达到自动化的目的。比如我们可以模拟一个FTP登录时所有交互,包括输入主机地址、用户名、密码、上传文件等,待出现异常还可以进行尝试自动处理。)

「你想向标准错误打印一条消息并返回某个非零状态码来终止程序运行」

通过 python 的 raise SystemExit(3) 命令可以主动抛出一个错误,通过 sys.stderr.write 将命令写到标准的输出端

直接将消息作为参数传给 SystemExit() ,那么你可以省略其他步骤

抛出一个 SystemExit 异常,使用错误消息作为参数,它会将消息在 sys.stderr 中打印,然后程序以状态码 1 退出

「你需要知道当前终端的大小以便正确的格式化输出。」

使用 os.get terminal size() 函数 来做到这一点。

「或移动文件和目录,但是又不想调用 shell 命令。」

shutil 模块 有很多便捷的函数可以文件和目录。使用起来非常简单

这里不多讲,熟悉Linux的小伙伴应该不陌生。

copytree() 可以让你在过程中选择性的忽略某些文件或目录。你可以提供一个忽略函数,接受一个目录名和文件名列表作为输入,返回一个忽略的名称列表。例如:

对于文件元数据信息, copy2() 这样的函数只能尽自己能力来保留它。 访问时间、创建时间和权限 这些基本信息会被保留,但是 对于所有者、ACLs、资源 fork 和其他更深层次的文件元信息就说不准了

通常不会去使用 shutil.copytree() 函数 来执行 系统备份 。当处理文件名的时候,使用 os.path 中的函数来确保的可移植性

使用 copytree() 文件夹的一个棘手的问题是对于错误的处理,可以使用异常块处理,或者通过 参数 ignore ling symlinks=True 忽略掉无效符号链接。

「创建或解压常见格式的归档文件(比如.tar, .tgz 或.zip)」

shutil 模块拥有两个函数—— make archive() 和 unpack archive() 可派上用场,

make archive() 的第二个参数是期望的输出格式。可以使用 get archive formats() 获取所有支持的归档格式列表。

os.walk() 方法 为我们 遍历目录树 ,每次进入一个目录,它会返回一个 三元组 ,包含 相对于查找目录的相对路径,一个该目录下的目录名列表,以及那个目录下面的文件名列表。

对于每个元组,只需检测一下目标文件名是否在文件列表中。如果是就使用 os.path.join() 合并路径。为了避免奇怪的路径名比如 ././foo//bar ,使用了另外两个函数来修正结果

os.walk(start) 还有跨平台的优势。并且,还能很轻松的加入其他的功能。我们再演示一个例子,下面的函数打印所有最近被修改过的文件:

打印10分钟之前被修改的数据

「怎样读取普通.ini 格式的配置文件?」

configparser 模块 能被用来读取配置文件

「你希望在脚本和程序中将诊断信息写入日志文件。」

python 脚本打印日志最简单方式是使用 如果实参的个数与形参不匹配时,调用函数运行就会报错logging 模块

五个日志调用( critical(), error(), warning(), (), debug() )以降序方式表示不同的级别。 basicConfig() 的 ll 参数是一个 过滤器 。所有级别低于此级别的日志消息都会被忽略掉。每个 logging 作的参数是一个消息字符串,后面再跟一个或多个参数。构造最终的日志消息的时候我们使用了 % 作符来格式化消息字符串。

如果你想使用配置文件,可以像下面这样修改 basicConfig() 调用:

logconfig.ini

在调用日志作前先执行下 basicConfig() 函数方法 ,可以找标准输出或者文件中输出

「你想给某个函数库增加日志功能,但是又不能影响到那些不使用日志功能的程序。」

使用这个配置,默认情况下不会打印日志,只有配置过日志系统,那么日志消息打印就开始生效

通常来讲,不应该在函数库代码中 自己配置日志系统 ,或者是已经有个已经存在的日志配置了。调用 getLogger( name ) 创建一个和调用模块同名的 logger 模块 。由于 模块 都是的,因此创建的 logger 也将是 的。所以当前进程中只有一个logging会生效。

log.addHandler(logging.NullHandler()) 作将一个 空处理器 绑定到刚刚已经创建好的 logger 对象 上。一个空处理器默认会忽略调用所有的日志消息。因此,如果使用该函数库的时候还没有配置日志,那么将不会有消息或出现。

在这里,根日志被配置成仅仅 输出 ERROR 或更高级别的消息 。不过, somelib 的日志级别被单独配置成可以输出 debug 级别的消息, 它的优先级比全局配置高。像这样更改单独模块的日志配置对于调试来讲是很方便的,因为你无需去更改任何的全局日志配置——只需要修改你想要更多输出的模块的日志等级。(这个还有待研究)

time 模块 包含很多函数来执行跟时间有关的函数。尽管如此,通常我们会在此基础之上构造一个更高级的接口来模拟一个计时器。

这个类定义了一个可以被用户根据需要启动、停止和重置的计时器。它会在elapsed 属性中记录整个消耗时间也是关键字传参。下面是一个例子来演示怎样使用它:

在计时中要考虑一个 底层的时间函数问题 。 一般来说, 使用 time.time() 或 time.clock() 计算的时间精度因作系统的不同会有所不同。而使用 time.perf_counter() 函数可以确保使用系统上面 最的计时器 。

「你想对在 Unix 系统上面运行的程序设置内存或 CPU 的使用限制。」

resource 模块 能同时执行这两个任务。例如,要限制 CPU 时间,下面的代码在windows平台执行不了,但是Linux是可以的。

程序运行时, SIGXCPU 信号 在时间过期时被生成,然后执行清理并退出。

这暂时没有好的Demo...

程序运行到没有多余内存时会抛出 MemoryError 异常。

setrlimit() 函数 被用来设置特定资源上面的 软限制和硬限制 。

setrlimit() 函数 还能被用来设置 子进程数量、打开文件数以及类似系统资源的限制(cgroup) 。

「通过脚本启动浏览器并打开指定的 URL 网页」

新窗口打卡网站

当前窗口打开一个tab页

指定浏览器类型,可以使用 webbrowser.get() 函数

Python爬虫杂记 - POST之multipart/form-data请求

这里通过 __enter__,__exit__ ,使用 with 语句 以及上下文管理器协议可以省略计时器打开和关闭作。(关于上下文管理协议,即with语句,为了让一个对象兼容with语句,必须在这个对象的类中声明 __enter__和__exit__方法, , __enter__ 在出现with语句被调用, __exit__ 在代码执行完毕被调用,可以参考open()方法)

enctype属def inner(args, kwargs):性:

enctype:规定了form表单在发送到时候编码方式,它有如下的三个值。

①application/x-www-form-encoded:默认的编码方式。但是在用文本的传输和MP3等大型文件的时候,使用这种编码就显得 效率低下。

②multipart/form-data:指定传输数据为二进制类型,比如、mp3、文件。

③text/plain:纯文体的传输。空格转换为 “+” 加号,但不对特殊字符编码。

值得注形参是在定义函数时定义的,放在函数名后面的圆括号里,可为空意的是:请求头的Content-Type属性与其他t请求的不同

总注:上边这两种构建参数的方式各有不同, 用起来感觉并不是那么的灵活,所以感叹requests有那么一丢丢丢的不足。值的注意的是,requests.t中files参数接收字典的形式和encode_multipart_formdata中params参数接收字典形式的区别!人生苦短......

在python中怎样获取命令行的原始参数

更多见日志模块文档s://

数1: sys1.通过-i -o选项来区别参数是输入文件还是输出文件..argv[1]

参数2: sys.argv[2]

test.py

1 import sys

2 print "脚本名:", sys.argv[0]

3 for i in range(1, len(sys.argv)):

4 print "参数", i, sys.argv[i]

>>>python test.py hello world

脚本名:test.py

参数 1 hello

参数 2对于想要执行日志作的函数库,你应该创建一个专属的 logger 对象,并且像下面这样初始化配置: world

例如我们需要一个convert.py脚本。它的作用是处理一个文件,并将处理后的结果输出到另一个文件中。

要求该脚本满足以下条件:

>>> python convert.py -i inputfile -o outputfile

2.当不知道convert.py需要哪些参数时,用-h打印出帮助信息

getopt函数原形:

getopt.getopt(args, options[, long_options])