入住 CI 中国社区 登录
CodeIgniter 中国开发者社区 返回首页

rosemarry的个人空间 https://codeigniter.org.cn/forums/?39678 [收藏] [复制] [分享] [RSS]

日志

python系列之小技巧

已有 1310 次阅读2016-3-24 14:56 |个人分类:python

and - or技巧

a="heaven"

b = "hell"

c = True and a or b

print(c)

d = False and a or b

print(d)

____________

输出:

heaven

hell

注意:

在一个bool  and a or b语句中,当bool条件为真时,结果是a;当bool条件为假时,结果是b

有点类似于c/c++中的bool?a:b(可以对比这个来看)

and - or真正的技巧在于,确保a的值不会为夹。最常用的方式是使a成为[a]、b成为[b],然后使用返回值列表的第一个元素

由于[a]是一个非空列表,所以它决不会为假。即使a是0或者''或者其他假值,列表[a]也为真,因为他有一个元素

元组

元组(tuple)也是一种序列,和我们用了很多次的list类似,只是元组中的元素在创建之后就不能被修改。

数学运算

import math

math包里有两个常量:

math.pi

圆周率 π:3.141592...

math.e

自然常数:2.718281

数值运算:

math.ceil(x)

对x向上取整,比如x=1.2,返回2

math.floor(x)

对x向下取整,比如x=1.2,返回1

math.pow(x,y)

指数运算,得到x的y次方

math.log(x)

对数,默认基底为e。可以使用第二个参数,来改变对数的基底。比如 math.log(100,10)

math.sqrt(x)

平方根

math.fabs(x)

绝对值

三角函数:

math.sin(x)

math.cos(x)

math.tan(x)

math.asin(x)

math.acos(x)

math.atan(x)

注意:这里的x是以弧度为单位,所以计算角度的话,需要先换算

角度和弧度互换:

math.degrees(x)

弧度转角度

math.radians(x)

角度转弧度

真值表

为了便于看清,我们用<=>来表示等价关系。

<=>左边表示逻辑表达式,<=>右边表示它的结果。

NOT

not False <=> True

not True <=> False

(not 的结果与原值相反)

OR

True or False <=> True

True or True <=> True

False or True <=> True

False or False <=>False

(只要有一个值为True,or的结果就是True)

AND

True and False <=> False

True and True <=> True

False and True <=> False

False and False <=> False

(只要有一个值为False,and的结果就是False)

NOT OR

not(True or False)<=>False

not(True or True)<=>False

not(False or True)<=>False

not(False or False)<=>True

NOT AND

not(True and False)<=>True

not(True and True)<=>False

not(False and True)<=>True

not(False and False)<=>True

!=

1!=0 <=>True

1!=1 <=> Flase

0!=1 <=> True

0!=0 <=>False

==(这个恒等)

1==0 <=>False

1==1 <=> True

0==1 <=> False

0==0 <=> True

正则表达式

正则表达式就是记录文本规则的代码。

所以正则表达式并不是python中特有的功能,它是一种通用的方法。python中的正则表达式库,所做的事情是利用正则表达式来搜索文本。要使用它,你必须会自己用正则表达式来描述文本规则。

1、

首先说一种最简单的正则表达式,它没有特殊的符号,只有基本的字母或数字。它满足的匹配规则就是完全匹配。默认情况下正则表达式是严格区分大小写的。

2、

“\b”在正则表达式中表示单词的开头或结尾,空格、标点、换行都算是单词的分割。而“\b”自身又不会匹配任何字符,它代表的只是一个位置。所以单词前后的空格标点之类不会出现在结果中

3.

re.findall(r"hi",text)

re是python里的正则表达式模块。findall是其中一个方法,用来按照提供的正则表达式,去匹配文本中的所有符合条件的字符串。返回结果是一个包含所有匹配的list。


最后再说一下[]这个符号。在正则表达式中,[]表示满足括号中任意字符。比如“[hi]”,它就不是匹配“hi”了,而是匹配“h”或者“i”

转义

r"hi"

这里字符串前面加了r,是raw的意思,它表示对字符串不进行转义

4.

  今天主要说两个符号"."和“*”,顺带说下"\S"和"?"

"."在正则表达式中表示除换行符以外的任意字符

与“.”类似的一个符号是"\S",它表示的是不是空白符的任意字符。注意是大写字符S.

5.

  在很多搜索中,会用"?"表示任意一个字符,“*”表示任意数量连接字符,这种被称为通配符。但在正则表达式中任意字符使用"."表示,

而"*"则不是表示字符,而是表示数量:它表示前面的字符可以重复任意多次(包括0次)只要满足这样的条件,都会被表达式匹配上。

这是因为"*"在匹配时,会匹配尽可能长的结果。如果你想让他匹配到最短的就停止,需要用".*?".如果“i.*?”,就会得到第二种结果。这种匹配方式被称为懒惰匹配,而原本尽可能长的方式被称为贪婪匹配。

从下面一段文本中,匹配出所有s开头,e结尾的单词。

text=site sea sue sweet see case sse ssee loses

re.findall("s.*?e",text)

表示数字的方法:

\d

要表示任意长度的数字,就可以用[0-9]*或者\d*

但要注意的是:*表示的任意长度包括0,也就是没有数字的空字符也会被匹配出来,一个与*类似的符合+,表示的则是1个或更长。

所以要匹配出所有数字串,应当用[0-9]+或者\d+

如果要限定长度,就用{}代替+,大括号里协商你想要的长度。比如11位的数字:\d{11}

想要把第一位限定为1,就在前面加上1,后面去掉一位: 1\d{10}

具有特殊意义的专用字符被称作“元字符”。常用的元字符还有:

\w:匹配字母或数字或下划线或汉字

\s:匹配任意的空白符

^:匹配字符串的开始

$:匹配字符串的结束

\S其实就是\s的反义,任意不是空白符的字符。

\W:匹配任意不是字母、数字、下划线、汉字的字符

\D:匹配任意非数字的字符

\B:匹配不是单词开头或结束的位置

[a]的反义是[^a],表示除a以外的任意字符。[^abcd]就是除abcd以外的任意字符。

之前我们用过*、+、{}来表示字符的重复。其他重复的方式还有:

?:重复零次或一次

{n,}:重复n次或更多次

{n,m}:重复n到m次

\d{15,18}:表示15到18位的数字,可以用来检测身份证号码

^1\d*[x]?

以1开头的一串数字,数字结尾有字母X,也可以没有。有的话带上X

随机数

random.randint(a,b)可以生成一个a到b间的随机整数,包括a和b

a、b都必须是整数,且必须b>=a。当等于的时候,比如:

random.randint(3,3)结果永远是3

random.random():生成一个0到1之间的随机浮点数,包括0但不包括1,也就是[0.0,1.0)

random.uniform(a,b):生成a、b之间的随机浮点数。不过与randint不同的是,a、b无需是整数,也不用考虑大小

random.choice(seq):从序列中随机选取一个元素。seq需要是一个序列,比如list、元组、字符串。

random.choice([1,2,5,8,13]) #list

random.choice('hello')  #字符串

random.choice(['hello','world'])  #字符串组成的list

random.choice((1,2,3))   #元组

random.randrange(start,stop,step)

生成一个从start到stop(不包括stop),间隔为step的一个随机数。start、stop、step都要为整数,且start<stop

random.randrange(1,9,2):就是从[1,3,5,7]中随机选取一个。

start 和step都可以不提供参数,默认是从0开始,间隔为1。但如果需要指定step,则必须指定start。

random.randrange(4)                                         #[0,1,2,3]

random.randrange(1,4)                                     #[1,2,3]

random.randrange(start,stop,step)                 其实在效果上等同于上面

random.choice(range(start,stop,step))

random.sample(population,k)                        从population序列中,随机获取k个元素,生成一个新序列。sample不改变原来序列。

random.shuffle(x)                                             把序列x中的元素顺序打乱。shuffle直接改变原有的序列。

以上是random中常用的几个方法。如果你在程序中需要其中某一个方法,也可以这样写:

from random import randint

randint(1,10)

另外,有些编程基础的同学可能知道,在随机数中有个seed的概念,需要一个真实的随机数,比如此刻的时间、鼠标的位置等等,以此为基础产生伪随机数。在python中默认用系统时间作为seed。你也可以手动调用random.seed(x)来指定seed。









路过

雷人

握手

鲜花

鸡蛋

评论 (0 个评论)

facelist doodle 涂鸦板

您需要登录后才可以评论 登录 | 入住 CI 中国社区