Python函数

Python函数

1.函数

Python是使用def语句创建函数。调用函数时,只要使用函数名加上用圆括号括起来的参数即可。

def example(a,b):
q = a // b   #//是截断除法运算符
   r = a-q*b
   return r
#调用函数
result = example(37,15)
#如果要让函数返回多个值可以使用元组
def example2(a,b):
q = a // b
   r = a - q*b
   return (q,r)
#使用元组返回多个值时可以很容易的将结果放在单独的变量中
value1,value2 = example(12,23)
#给函数参数提供一个默认值
def connect(hostname,port,timeout = 300)
#函数体
#调用时可以忽略默认值参数
connect('11.11.111.11',8080) #第一种方式
connect(hostname = '11.11.111.11',port = 80) #可以以任意参数顺序调用

函数体中创建的变量,默认作用域是局部的,当函数返回值后会立即销毁该变量。如果函数内部修改某个全局变量的值,可以使用global语句。

count = 0
def foo():
global count
   count += 1

2.生成器

任何使用yield语句的函数都成为生成器,调用生成器函数将创建一个对象,该对象通过调用next()生成结果序列。可以让一个函数生成一个结果序列,而不仅仅是一个值

def exaple(n):
   print("Counting down")
   while(n > 0):
       yield n          #生成一个值(n)
       n -= 1

生成器是基于处理管道、流或数据流编写程序的一种极其强大的方式。例如,下面的生成器函数模拟了常用于监控日志文件的UNIX tail -f命令的行为:

import time
def tail(f):
   f.seek(0,2) #移动到EOF
   while True:
line = f.readline() #尝试读取一个新的文本行
       if not line:        #如果没有内容,暂时休眠并再次尝试
           time.sleep(0.1)
           continue
       yield line

下面的生成器用于在很多行中查找特定的子字符串

def grep(lines,searchtext):
   for line in lines:
       if searchline in line :
           yield line

将两个生成器合并在一起,创建一个简单的处理管道

#UNIX "tail -f | grep python" 命令的Python实现
wwwlog = tail(open("access-log"))
pylines = grep(wwwlog,"python")
for line in pylines:
print(line)

生成器的微妙之处在于,它经常和其它可迭代的对象(如列表或文件)混合在一起,特别是在编写如 for item in s 这样的语句时,s可以代表项目的列表,文件的港航,生成器函数的结果,或者可支持迭代的其他任何对象。能够在s中插入不同对象,这在创建可扩展程序时发挥巨大的作用。

2.协程

函数运行时要使用一组输入参数,也可以把函数编写为一个任务,从而能处理发送给他的一系列输入。这类函数称为协程,可用yield语句并以表达式yield的形式创建协程

def print_matches(matchtext):
   print("Looking for", matchtext)
   while True:
       line = (yield)
       if matchtext in line :
print line

3.语法规则

Python可以使用制表符进行缩进,但并不鼓励这样做。Python编程社区首选的是空格。遇到制表符时,系统会将其转换为移到下一个为8倍数的列所需要的空格量。

要在一行上放置多条语句,可以使用分号隔开各条语句

以一个划线开始的标识符(如_foo)不能使用from module import * 语句导入

前后均有双下划线的标识符(如init)是为特殊方法保留的

前面带有双下划线的标识符(如__bar)则用于实现私有的类成员

如果模块,类或函数定义的第一条语句是一个字符串,该字符串就成为了相关对象的文档字符串

4.装饰器

函数,方法或类定义的前面可以使用一个特殊的符号,成为装饰器,目的是修改定义后面的行为。可以使用多个装饰器,但是每个装饰器必须位于不同的行上。

posted @ 2020-06-01 14:14  麦郎  阅读(145)  评论(0)    收藏  举报