前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python基础知识总结

Python基础知识总结

作者头像
Locker
发布2018-08-01 17:39:26
1.5K0
发布2018-08-01 17:39:26
举报
文章被收录于专栏:221-B221-B
python
python

WHY Python?

首先,学一门语言都会问:点解要学这门语言? 而学Python的原因很简单,原因就是…..好鬼简单.(这句话不是我说的) 很喜欢Python极简的代码风格,以及众多功能强大的模块…… 学了两天Python有点点体会,觉得应该总结一下有哪些应该注意的地方.

基本问题

学习途径

初学者推荐一个公众号:Crossin的编程教室(喜欢作者的教学方式)

环境配置

用Mac或者Linux的同学是幸福的,直接在终端输入idle就好了,这两个系统都是默认自带Python的,如果想直接在终端打开Python Shell,直接输入python就好了.windows下就有点麻烦,好吧,事实上麻烦到我不想去尝试配置了,详情见Crossin的编程教室第一课.

配置好之后就可以打出你的第一行代码啦!

>>>print ‘Hello World!’

基本语法

print

这个函数的兼容性可以说极强

>>> print “hello” #双引号可以 hello >>> print ‘world’ #单引号可以 world >>> print 1 #纯数字直接写 1 >>> print 3.14 3.14 >>> print 3e30 3e+30 >>> print 1 + 2 * 3 #支持表达式计算 7 >>> print(2 > 5) #支持真假判断 False

有一点值得注意的是:2.0版本print和print()都是可以的,但是3.0之后print后面的表达式必须加括号.

input()和raw_input()

input() 接收的是一个值或变量,也就是说,你如果输 123,程序接收到的就是整数 123,你输 True,就是 bool 值 True。如果你输了 python,程序会认为这是一个叫做 python 的变量,而假如你没有定义过这个变量,就会报错。所以如果想通过input获得一段文字,输入的时候必须把文字用双引号或者单引号括起来.

raw_input()接收的是一个字符串,不管你输入什么都会当做一个字符串.

然后在3.0之后,将input()raw_input()合并了,为了减少混乱吧…保留input关键字,但是功能确保留了raw_input的功能,就是说,在3.0之后,你用input(),获得的就是一段字符串,无论你输入什么.那么问题来了,我想要获得一个值或者一个变量肿么办?value = eval(input())即可.

变量

命名规则:

  • 第一个字符必须是字母或者下划线“_”
  • 剩下的部分可以是字母、下划线“_”或数字(0-9)
  • 变量名称是对大小写敏感的,myname和myName不是同一个变量。

Python是动态变量类型的,定义变量的时候不需要指明这个变量是什么类型,编译器会根据赋给变量的值去判断类型:

name = ‘Crossin’ #字符型(需要用’ ‘或者” “引起来) myVar = 123 #整型 price = 5.99 #浮点型 visible = True #布尔型 a = 1 > 3 #通过逻辑表达式赋值

bool(‘False’)

在python中,以下数值会被认为是False:

  • 为0的数字, 包括0,0.0
  • 空字符串, 包括 ‘’ , “”
  • 表示空值的None
  • 空集合, 包括() , [] , {}

其他的值都认为是True。 因为’False’是一个非空字符串,所以转成bool类型之后,就是True,所以bool(‘False’) = True,同理bool(‘ ‘) = True.

格式化

Python不需要用分号来结束一行代码,取而代之的就是严格的缩进格式,刚刚开始就是过因为缩进格式不对,不断出现错误,具体你在敲一个回车的时候,下一行要缩进几格是可以设置的:Preferences->Indentation Width(这个是mac下的设置路径,windows下的名字也应该大同小异)

import

代码语言:javascript
复制
import random

import语句告诉python,我们要用random模块中的内容。然后便可以使用random中的方法,比如:

代码语言:javascript
复制
random.randint(1, 10)
random.choice([1, 3, 5])

注意,函数前面需要加上“random.”,这样python才知道你是要调用random中的方法。

想知道random有哪些函数和变量,可以用dir()方法:

代码语言:javascript
复制
dir(random)

如果你只是用到random中的某一个函数或变量,也可以通过from…import…指明:

代码语言:javascript
复制
from math import pi
print pi

为了便于理解和避免冲突,你还可以给引入的方法换个名字:

代码语言:javascript
复制
from math import pi as math_pi
print math_pi

读写文件

读写文件有三种模式:

  • r:只读模式
  • w:覆盖模式
  • a:添加模式

函数格式: file(‘文件名’,’参数’) open(‘文件名’,’参数’)

读文件命令很简单:

代码语言:javascript
复制
file('文件名') #默认参数为r

如果文件和代码放在同一个文件夹,直接写名字就好了,不是就要写文件的绝对路径.还有很神奇的一点就是,如果路径没有找到文件,就会自动创建这个文件.

and-or

代码语言:javascript
复制
c = bool and a or b 

通常情况下,只要bool值为真则a,为假则b 但如果当a本身就为假,比如0,’’.这时,几时bool为真也会取b,所以为了避免这种情况,应当将a->[a] , b->[b],将元素变成列表,即使是[‘’]或者[0]这是为真的,但是对应的,表达式返回的也是一个列表,去列表第一个元素即可,因此表达式也要相应改变一下:

代码语言:javascript
复制
c = (bool and [a] or [b])[0]

随机数

首先,使用之前都要import random模块:

代码语言:javascript
复制
import random

调用时是调用类方法的的形式:

代码语言:javascript
复制
num = random.randint(1,100)

常用的方法;

代码语言:javascript
复制
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.randrange(start, stop, step) #生成一个从start到stop(不包括stop),间隔为step的一个随机数。start、stop、step都要为整数,且start<stop。

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

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

列表解析

Python的列表(list)就是数组,支持表达式赋值 比如从另一个list中去部分元素:

代码语言:javascript
复制
ist_1 = [1, 2, 3, 5, 8, 13, 22]
list_2 = [i for i in list_1 if i % 2 == 0] #从list_1中取出模2的数
print list_2

输出
[2, 8, 22]

正则表达式

常用特殊符号

可以看我之前写的一篇博文:python正则表达式的部分特殊符号

值得注意的地方

Hi和hi: 默认情况下,正则表达式是严格区分大小写的. [0-9]: [0123456789]可以写成[0-9]这种形式,同理,类似的还有[a-zA-Z]. (): ()在正则表达式里也有着特殊的含义, 所以要匹配字符”(“, 需要用”\(“.

懒惰匹配和贪婪匹配

代码语言:javascript
复制
".*" 和 ".*?"

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

函数的参数传递

基本方式:

fun1(a,b) : 调用时提供参数的位置进行匹配,要求实参与行参的数量相等,默认按位置匹配参数。调用时,少参数或者多参数都会引起错误。

代码语言:javascript
复制
def func(arg1, arg2):
     print arg1, arg2

func(3, 7)

Python 还提供了其他一些更灵活的参数传递方式,如:

func2(a=1, b=2, c=3) : 有默认值,当没有提供足够的参数时, 会用默认值作为参数的值.提供的参数会按顺序先匹配前面位置的参数, 后面未匹配到的参数使用默认值.

代码语言:javascript
复制
def func(arg1=1, arg2=2, arg3=3):
print arg1, arg2, arg3

func(2, 3, 4)
func(5, 6)
func(7) 

输出为
2 3 4
5 6 3
7 2 3

当然,也可以直接用形参去指定某个参数,但是,没有指定参数名的参数必须在所有 指定参数名的参数前面, 且参数不能重复.

代码语言:javascript
复制
func(arg2=8)
func(arg3=9, arg1=10)
func(11, arg3=12)

func3(*args) : 这种方式的厉害之处在于, 它可以接受任意数量的参数.

代码语言:javascript
复制
def calcSum(*args):
sum = 0
for i in args:
    sum += i
print sum


calcSum(1,2,3)
calcSum(123,456)
calcSum()

输出:
6
579
0

在变量前加上星号前缀(*),调用时的参数会存储在一个 tuple(元组)对象中,赋值给形参。在函数内部,需要对参数进行处理时,只要对这个 tuple 类型的形参(这里是 args)进行操作就可以了。因此,函数在定义时并不需要指明参数个数,就可以处理任意参数个数的情况。

不过有一点需要注意,tuple 是有序的,所以 args 中元素的顺序受到赋值时的影响。如:

代码语言:javascript
复制
def printAll(*args):
    for i in args:
        print i,
    print

printAll(1,2,3)
printAll(3,2,1)

输出:
1 2 3
3 2 1

虽然3个参数在总体上是相同的,但由于调用的顺序不一样,结果也是不同的。

func4(**kargs) : 既可以按参数名传递参数, 不受位置的限制, 又可以像 tuple 传递一样不受数量限制.因为func(**kargs) 则是把参数以键值对字典的形式传入。字典是无序的,所以在输出的时候,并不一定按照提供参数的顺序。同样在调用时,参数的顺序无所谓,只要对应合适的形参名就可以了。于是,采用这种参数传递的方法,可以不受参数数量、位置的限制。

代码语言:javascript
复制
def printAll(**kargs):
    for k in kargs:
        print k, ':', kargs[k]

printAll(a=1, b=2, c=3)
printAll(x=4, y=5)

输出:
a : 1
c : 3
b : 2
y : 5
x : 4

当然,Python能做到的不仅如此,以上几种方式不满意,你还可以混着用.

代码语言:javascript
复制
def func(x, y=5, *a, **b):
     print x, y, a, b

func(1)
func(1,2)
func(1,2,3)
func(1,2,3,4)
func(x=1)
func(x=1,y=1)
func(x=1,y=1,a=1)
func(x=1,y=1,a=1,b=1)
func(1,y=1)
func(1,2,3,4,a=1)
func(1,2,3,4,k=1,t=2,o=3)

输出:
1 5 () {}
1 2 () {}
1 2 (3,) {}
1 2 (3, 4) {}
1 5 () {}
1 1 () {}
1 1 () {'a': 1}
1 1 () {'a': 1, 'b': 1}
1 1 () {}
1 2 (3, 4) {'a': 1}
1 2 (3, 4) {'k': 1, 't': 2, 'o': 3}

在混合使用时,首先要注意函数的写法,必须遵守:

  • 带有默认值的形参(arg=)须在无默认值的形参(arg)之后;
  • 元组参数(*args)须在带有默认值的形参(arg=)之后;
  • 字典参数(*kargs)须在元组参数(args)之后。

可以省略某种类型的参数,但仍需保证此顺序规则。调用时也需要遵守:

  • 指定参数名称的参数要在无指定参数名称的参数之后;
  • 不可以重复传递,即按顺序提供某参数之后,又指定名称传递。

而在函数被调用时,参数的传递过程为:

  1. 按顺序把无指定参数的实参赋值给形参;
  2. 把指定参数名称(arg=v)的实参赋值给对应的形参;
  3. 将多余的无指定参数的实参打包成一个 tuple 传递给元组参数(*args);
  4. 将多余的指定参数名的实参打包成一个 dict 传递给字典参数(**kargs)。

lambda

lambda是一种匿名函数,而且是一个极度简单的单行函数.

语法格式:

代码语言:javascript
复制
lambda 参数列表: 表达式

例子:

代码语言:javascript
复制
def sum(a, b, c):
     return a + b + c

->sum = lambda a, b, c: a + b + c     

map()和reduce()

首先来说两个例子:

代码语言:javascript
复制
1. 假设有一个数列,如何把其中每一个元素都翻倍?
2. 假设有两个数列,如何求和?

第一个问题:

代码语言:javascript
复制
lst_1 = (1,2,3,4,5,6)
lst_2 = map(lambda x: x * 2, lst_1)
print lst_2

第二个问题:

代码语言:javascript
复制
print reduce((lambda x, y: x + y), xrange(1, 101))

教程里是这么解释的:

代码语言:javascript
复制
"map 可以看作是把一个序列根据某种规则,映射到另一个序列。reduce 做的事情就是把一个序列根据某种规则,归纳为一个输出。"    

先看看函数的调用格式:

代码语言:javascript
复制
map: map(函数,序列) #第一个参数是一个函数, 之后的参数是序列, 可以是 list、tuple.

reduce: reduce(函数,序列) #第一个参数也是一个函数, 之后的参数是序列, 可以是 list、tuple.

它们的的区别就在与函数参数的功能不同,map的参数函数必须是一个一元操作函数,reduce的参数函数必须是一个二元操作函数所以通常map返回的是一个序列,二reduce返回的是一个运算结果.

所以,如果你要处理一个序列以获得新的序列,就用map; 如果想根据一个数列计算出某个结果,那就用reduce吧~~~

ps: Python3.0之后, reduce已经被移出内置函数, 使用 reduce 需要先通过 from functools import reduce 引入.

range()和xrange()

上面的总结reduce的时候提到了xrange()这个函数,开始我也只是奇怪,并没有去纠结它和range()有什么不同,但是某一次我试着打印xrange(1,11),发现输出也是xrange(1,11):

xrange
xrange

而打印range(1,11),输出的是一个列表:

range
range

其实range()xrange()的定义是一样的:

代码语言:javascript
复制
range(start=0,stop,step)
xrange(start=0,stop,step)
  • start表示列表开始的值,默认为“0”。
  • stop 表示列表结束的值,该参数不可缺少
  • 参数step表示步长,默认值为“1”。
contrast
contrast

不同的是:range()返回一个递增或递减的数字列表, xrange 是一个类, 返回的是一个xrange对象. 所以打印出来才会是像xrange(1,11)这样的结果.

xrange()的优点在于:使用xrange()进行遍历, 每次遍历只返回一个值. range()返回的是一个列表, 一次性计算并返回所有的值. 因此, xrange()的执行效率要高于range().

多线程

Python到处都体现着简单这两个字. 开辟多线程只需一行代码:

代码语言:javascript
复制
start_new_thread(function, args[, kwargs])
  • function 是开发者定义的线程函数,
  • args 是传递给线程函数的参数,必须是tuple类型,
  • kwargs 是可选参数。

不用手动管理线程, 通常情况, 线程在 function 执行完毕后结束.

然而Python的多线程并不完善,这里推荐两篇文章,有兴趣可以去研读一下:

理解 Python 中的多线程 Python 的 GIL 是什么鬼,多线程性能究竟如何

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2016-05-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • WHY Python?
  • 基本问题
    • 学习途径
      • 环境配置
      • 基本语法
        • print
          • input()和raw_input()
            • 变量
              • bool(‘False’)
                • 格式化
                  • import
                    • 读写文件
                      • and-or
                        • 随机数
                          • 列表解析
                          • 正则表达式
                            • 常用特殊符号
                              • 值得注意的地方
                                • 懒惰匹配和贪婪匹配
                                • 函数的参数传递
                                • lambda
                                • map()和reduce()
                                • range()和xrange()
                                • 多线程
                                领券
                                问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档