python中函数可以增强代码可读性吗_进击python第三篇:基础

本文介绍了Python编程的一些基础概念和实用技巧,包括序列解包、交换变量、迭代工具的使用,如zip、enumerate、sorted和reversed。此外,还讲解了函数的定义、参数类型以及动态参数的应用。文章强调了函数的重用性和可读性,并举例说明如何通过函数提高代码质量。最后,提到了条件判断和错误处理,如assert语句的使用。
摘要由CSDN通过智能技术生成

基础拾遗

序列解包

例:

>>>x,y,z=1,2,3

>>>printx,y,z1 2 3

交换变量也是没问题

>>>x,y=y,x>>>printx,y,z2 1 3     #这个很实用

当函数或方法返回元组(或其它序列或可迭代对象)时,这个特性特别有用。假如需要获取(和删除)字典中任意的键-值对,可以使用popitem方法,将键值对作为元组返回,那么就可以直接赋值到两变量中

例:

>>> dic1={'name':'lzl','girlfriend':'None'}>>> key,value=dic1.popitem()>>> printkey,value

girlfriend None

赋值时要求序列中的元素和=左边的变量数量一致,否则引发异常valueError

注:python 3.0另一解包特性:允许像在函数中的参数列表中一样使用星号,例如 a,b,*test=[1,2,3,4,5],这样test的结果是[3,4,5]

链式赋值

是将同一值赋值给多变量的捷径。

x=y=somefunction()

等同于

y=somefunction()

x=y

但与如下不一定等同:

x=somefunction()

y=somefunction()

布尔值知识补充

标准值False、None、所有类型的数字0、空序列、空字典都为假;其它一切为真,包括特殊值True

name=''

while not name or name.isspace() :

name = raw_input('please input your name:')

print 'hello,%s' % name

实用:在做判断输入是否为空时,输入了空格会判断为真,却又不易察觉,可以使用while not name or name.isspace()或while not name.strip()

断言

如果需要确保程序中某条件为真才能继续运行,assert语句就有用了,相当于if语句做了一次判断

例子:

>>> age = 1

>>> assert 0

>>> age = -1

>>> assert 0

File"", line 1, in AssertionError: The age must be realistic

一些迭代工具

在python中迭代序列(或其它可迭代对象),有一些函数非常好用

1.并行迭代

names = ['lzl','Bruce Li','damon']

age= [18,20,28]print zip(names,ages)

输出:[('lzl', 18), ('Bruce Li', 20), ('damon', 28)]

内建的zip函数可用来并行迭代,像是上面介绍序列解包的相反过程

重要的一点是zip可处理不等长的序列,当最短的序列“用完”的时候就停止。

>>> zip(range(5),xrange(100))

[(0, 0), (1, 1), (2, 2), (3, 3), (4, 4)]

2.按索引迭代

有些时候想要迭代序列中的对象,同时还要获取对象对应的索引。这时内建函数enumerate可以在提供索引的地方迭代索引-值对,默认索引从0开始

例子:

>>> li=['北京','四川','重庆']>>> for index,string in enumerate(li,1): #索引从1开始

... print index,"---",string

...1 ---北京2 ---四川3 --- 重庆

实用:可用作菜单选项制作

3.翻转和排序迭代

函数reserved和sorted同列表的reserve和sort方法类似,但作用于任何和序列或可迭代对象上,不是原地修改对象,而是返回翻转或排序后的版本

例子:

>>> list1=[4,3,6,2,1]>>>sorted(list1)

[1, 2, 3, 4, 6]>>>list1 #list1没有改变

[4, 3, 6, 2, 1]>>>reversed(list1)

>>>list1 #list1没有改变

[4, 3, 6, 2, 1]

注意:sorted方法返回列表,而reserved返回一个可迭代对象

列表推导式--轻量级循环

列表推导式(list comprehension)是利用其它列表创建新列表(类似数学术语中的集合推导式)的一种方法。

>>> [x*x for x in range(10)]

[0,1, 4, 9, 16, 25, 36, 49, 64, 81]>>> [x*x for x in range(10) if x % 3 ==0] #输出能被3整除的

[0,9, 36, 81]

对比,以for语句创建列表:

result =[]for a in range(3):for b in range(3):

result.append((a,b))print result

输出:[(0, 0), (0, 1), (0, 2), (1, 0), (1, 1), (1, 2), (2, 0), (2, 1), (2, 2)]

例:

>>> girls=['alice','bernice','clarice']>>> boys=['chris','arnold','bob']>>> [b+'+'+g for b in boys for g in girls if b[0] == g[0]] #要求得到首字母相同的男孩女孩

['chris+clarice', 'arnold+alice', 'bob+bernice']

函数

内置函数

856286-20160104184730950-1328467381.png

vars():显示当前模块的变量,比如

__file__:路径

__doc__:当前模块的注释

__name__:被执行的脚本__name__值=__main__,代表就是主函数(程序入口)

id():显示内存地址 is:比对两值得内存地址

all():接受一个序列,如果内部所有的值都是真的,返回真,否则返回假;用于用户输入判定

any():接受一个序列,只要内部元素有一个真,返回真

ord():接受一个字符返回ascci码对应值 相反chr()

hex():转换十进制成16进制 oct():转换十进制成8进制 bin():转换十进制成2进制

自定义函数

whileTrue:if cpu利用率 > 90%:#发送邮件提醒

连接邮箱服务器

发送邮件

关闭连接if 硬盘使用空间 > 90%:#发送邮件提醒

连接邮箱服务器

发送邮件

关闭连接if 内存占用 > 80%:#发送邮件提醒

连接邮箱服务器

发送邮件

关闭连接

上述代码,if条件语句下的内容可以被提取出来公用,如下:

def发送邮件(内容)#发送邮件提醒

连接邮箱服务器

发送邮件

关闭连接whileTrue:if cpu利用率 > 90%:

发送邮件('CPU报警')if 硬盘使用空间 > 90%:

发送邮件('硬盘报警')if 内存占用 > 80%:

对于上述的两种实现方式,第二次必然比第一次的重用性和可读性要好,其实这就是函数式编程和面向过程编程的区别:

函数式:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可

面向对象:对函数进行分类和封装,让开发“更快更好更强...”

函数式编程最重要的是增强代码的重用性和可读性

函数的定义主要有如下要点:

· def:表示函数的关键字

· 函数名:函数的名称,日后根据函数名调用函数

· 函数体:函数中进行一系列的逻辑计算,如:发送邮件、计算出 [11,22,38,888,2]中的最大数等...不自动执行,调用后才执行

· 参数:为函数体提供数据

· 返回值:当函数执行完毕后,可以给调用者返回数据。如果没有指定返回值,返回None

def函数名(参数):

...

函数体

...

返回值

所有的函数都返回了东西,没有指定返回值时返回None

>>> deftest():print 'this is printed'

return #return后没接任何参数,起到结束函数作用

print 'this is not'

>>> x=test()

thisis printed

参数

形式参数:写在def语句中函数名后的变量

注:参数只是变量而已,在函数内为参数赋予新值不会改变外部任何变量的值,即局部作用域(local scope);

实际参数:调用函数时提供的实参

默认参数:必须放到最后,可以有多个

动态参数:

第1种

>>> def func(*args):printargs>>> func(18)

(18,)>>> func(18,'qq')

(18, 'qq')>>> li=[1,2,'a']>>>func(li)

([1, 2, 'a'],)>>> func(*li)

(1, 2, 'a')

特点:

可以接受多个参数;

内部自动构造元组,即返回元组类型

序列前加*避免内部构造元组

第2种

>>> def func(**args):

...printargs

...>>> func(123)

Traceback (most recent call last):

File"", line 1, in TypeError: func() takes exactly 0 arguments (1given)>>> func(k1=123,k2='abc') #以key=value形式传入参数

{'k2': 'abc', 'k1': 123}>>> dic={'k1':18,'k2':'lzl'}>>>func(dic)

Traceback (most recent call last):

File"", line 1, in TypeError: func() takes exactly 0 arguments (1given)>>> func(**dic) #传入字典类型时,加**

{'k2': 'lzl', 'k1': 18}

特点:

1.只接受key=value的参数

2.当是字典时,加**

通过以上验证得出动态参数除了是单值就是‘key=value’形式,因此如果结合使用就强大了,同字符串的forma()方法

>>>help(str.format)

Help on method_descriptor:

format(...)

S.format(*args, **kwargs) ->string

Return a formatted version of S, using substitutionsfrom args andkwargs.

The substitutions are identified by braces ('{' and '}').

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值