基础拾遗

序列解包

例:

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

>>>print x,y,z

1 2 3

交换变量也是没问题

>>>x,y=y,x

>>>print x,y,z

2 1 3      #这个很实用

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

例:

>>> dic1={'name':'lzl','girlfriend':'None'}
>>> key,value=dic1.popitem()
>>> print key,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 <10
>>> age = -1
>>> assert 0<age<10,'The age must be realistic'
Traceback (most recent call last):
File "<input>", line 1, in <module>
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)
<listreverseiterator object at 0x02A98C70>
>>> 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']

 

函数

内置函数

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

__file__:路径

__doc__:当前模块的注释

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

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

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

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

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

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

 

自定义函数

while True:
if cpu利用率 > 90%:
#发送邮件提醒
连接邮箱服务器
发送邮件
关闭连接 if 硬盘使用空间 > 90%:
#发送邮件提醒
连接邮箱服务器
发送邮件
关闭连接 if 内存占用 > 80%:
#发送邮件提醒
连接邮箱服务器
发送邮件
关闭连接

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

def 发送邮件(内容)
#发送邮件提醒
连接邮箱服务器
发送邮件
关闭连接 while True: if cpu利用率 > 90%:
发送邮件('CPU报警') if 硬盘使用空间 > 90%:
发送邮件('硬盘报警') if 内存占用 > 80%:

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

  • 函数式:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可
  • 面向对象:对函数进行分类和封装,让开发“更快更好更强...”

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

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

  • · def:表示函数的关键字
  • · 函数名:函数的名称,日后根据函数名调用函数
  • · 函数体:函数中进行一系列的逻辑计算,如:发送邮件、计算出 [11,22,38,888,2]中的最大数等...不自动执行,调用后才执行
  • · 参数:为函数体提供数据
  • · 返回值:当函数执行完毕后,可以给调用者返回数据。如果没有指定返回值,返回None
def 函数名(参数):

    ...
函数体
...

返回值

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

>>> def test():
print 'this is printed'
return #return后没接任何参数,起到结束函数作用
print 'this is not'
>>> x=test()
this is printed

参数

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

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

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

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

动态参数:

第1种

>>> def func(*args):
print args >>> 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):

... print args

...

>>> func(123)

Traceback (most recent call last):

File "<input>", line 1, in <module>

TypeError: func() takes exactly 0 arguments (1 given)

>>> func(k1=123,k2='abc')   #以key=value形式传入参数

{'k2': 'abc', 'k1': 123}

>>> dic={'k1':18,'k2':'lzl'}

>>> func(dic)

Traceback (most recent call last):

File "<input>", line 1, in <module>

TypeError: func() takes exactly 0 arguments (1 given)

>>> 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 substitutions from args and kwargs.
The substitutions are identified by braces ('{' and '}').

以上内容参考《python基础教程第二版》和武sir博客http://www.cnblogs.com/wupeiqi/articles/4943406.html 整理完成,主要记录要点。

进击python第三篇:基础的更多相关文章

  1. Python(三)基础篇之「模块&面向对象编程」

    [笔记]Python(三)基础篇之「模块&面向对象编程」 2016-12-07 ZOE    编程之魅  Python Notes: ★ 如果你是第一次阅读,推荐先浏览:[重要公告]文章更新. ...

  2. Python 第三篇(上):python文件基础操作、json模块、lambda、map、filter、reduce和函数位置参数

    python一切皆对象,linux一切皆文件,python操作文件是很常见的O/I操作,其内置来open()函数可以完成文件的基本操作: 一:使用内置open()函数操作文件,基本语法如下: with ...

  3. [Python笔记]第一篇:基础知识

    本篇主要内容有:什么是python.如何安装python.py解释器解释过程.字符集转换知识.传参.流程控制 初识Python 一.什么是Python Python是一种面向对象.解释型计算机程序设计 ...

  4. 【Python】Java程序员学习Python(三)— 基础入门

    一闪一闪亮晶晶,满天都是小星星,挂在天上放光明,好像许多小眼睛.不要问我为什么喜欢这首歌,我不会告诉你是因为有人用口琴吹给我听. 一.Python学习文档与资料 一般来说文档的资料总是最权威,最全面的 ...

  5. Python 第三篇(下):collections系列、集合(set)、单双队列、深浅copy、内置函数

     一.collections系列: collections其实是python的标准库,也就是python的一个内置模块,因此使用之前导入一下collections模块即可,collections在py ...

  6. python第三天基础之字符编码

    一 了解字符编码的知识储备 1. 文本编辑器存取文件的原理(nodepad++,pycharm,word) 打开编辑器就打开了启动了一个进程,是在内存中的,所以在编辑器编写的内容也都是存放与内存中的, ...

  7. python第三篇:python、flask关系映射

    python中关系映射主要包括三种:一对多关系映射.一对一关系映射.多对多关系映射. 一对多关系映射 一方:Student(学生) 添加关联属性和反向引用 多方:Article(文章) 添加外键关联 ...

  8. 进击python第4篇:初探模块

    模块,用一砣代码实现了某个功能的代码集合,任何python程序都可以作为模块导入,n个 .py 文件组成的代码集合就称为模块. but 为什么要引入模块概念?主要原因是代码重用(code reuse) ...

  9. 【0728 | 预习】第三篇 Python基础

    第三篇 Python基础预习 Part 1 变量 一.什么是变量? 二.为什么要有变量? 三.定义变量 四.变量的组成 五.变量名的命名规范 六.变量名的两种风格 Part 2 常量 Part 3 P ...

随机推荐

  1. UVA 10951 - Polynomial GCD(数论)

    UVA 10951 - Polynomial GCD 题目链接 题意:给定两个多项式,求多项式的gcd,要求首项次数为1,多项式中的运算都%n,而且n为素数. 思路:和gcd基本一样,仅仅只是传入的是 ...

  2. mongodb学习之:GridFS

    GridFS是一种在Mongodb中存储大二进制文件的机制.GridFS 用于存储和恢复那些超过16M(BSON文件限制)的文件(如:图片.音频.视频等). 使用GridFS有如下几个原因: 1 利用 ...

  3. BAT网络运维常见面试题目总结

    BAT常见面试题目总结 Author:Danbo 2015-7-11 TCP/IP详解鸟哥Linux的书网络安全ping的原理make的过程文件有哪些类型各种Linux发行版的区别.有关suid的作用 ...

  4. BZOJ1086 王室联邦 —— 树分块

    题目链接:https://vjudge.net/problem/HYSBZ-1086 1086: [SCOI2005]王室联邦 Time Limit: 10 Sec  Memory Limit: 16 ...

  5. 编辑xml文件时不能自动提示问题的解决

    在编辑xml文件时,eclipse总是不能自动提示,在网上找了一些资料,大部分都是说关于xml editor配置的,下面也把这个方法罗列在下面,以供参考: 解决办法:在eclipse的菜单里,找到wi ...

  6. Numpy中的flatten是按照什么方式进行工作。

    a = [[[1,2],[3,4]],[[5,6],[7,8]]] a = np.ndarray(a) array([[[1, 2], [3, 4]], [[5, 6], [7, 8]]]) type ...

  7. 003 - 修改Pycharm的项目文件树样式

    相信习惯了Eclipse或者Windows的小伙伴对于Pycharm的目录树一定觉得特别别扭 因为它总是在文件前加一个三角形标注, 这样的标注在视觉上十分误导层级关系 修改的方式为   File -& ...

  8. mysql审计实现方法

    Mysql版本: 5.6.24-72.2 一.通过init-connect + binlog 实现MySQL审计功能 基本原理: 由于审计的关键在于DML语句,而所有的DML语句都可以通过binlog ...

  9. 记SCOI2017

    Day1完挂,OI再见. 居然卡进去了. UESTC的评测机见鬼啊,我本地不到1s.时限是3s的两道题都T了,然后就少了50pt. Day1 T1看完首先O(n^2)DP是裸的,然后感觉n选k好像不能 ...

  10. codevs 3012 线段覆盖4

    传送门 3012 线段覆盖 4  时间限制: 1 s  空间限制: 64000 KB  题目等级 : 黄金 Gold   题目描述 Description 数轴上有n条线段,线段的两端都是整数坐标,坐 ...