Python学习----第一模块笔记(Python基础知识)

1、python是什么?

python是动态解释型的强类型定义语言。

python官方版本的解释器是CPython。该解释器使用C语言开发。

当前主要使用3.x版本的python。

2、第一个python程序

>>> print("Hello World!")
Hello World!

Linux下使用./xxx.py执行python执行python程序,在文件开头添加如下代码:

#!/usr/bin/env python

3、字符编码

英文编码系统:ASCII,可以表示255个字符

中文编码系统:GB2312(1980,7445个字符)-->GBK1.0(1995,21886个字符,中文Windows默认编码)-->GB18030(2000)

Unicode:万国码,世界统一的一种编码系统

UTF-8:Unicode的子集,对Unicode进行优化

python 3.x版本的默认编码是UTF-8。如需要定义程序文件的编码在开头添加# -*- coding: 字符编码 -*-语句。

e.g:

# -*- coding: utf-8 -*-

4、变量

a = 1
#声明一个变量,变量名a,值为1

定义变量的规则:

  • 变量名只能是 字母、数字或下划线的任意组合
  • 变量名的第一个字符不能是数字
  • 以下关键字不能声明为变量名:

    ['and', 'as', 'assert', 'break', 'class', 'continue', 'def', 'del', 'elif', 'else', 'except', 'exec', 'finally', 'for', 'from', 'global', 'if', 'import', 'in', 'is', 'lambda', 'not', 'or', 'pass', 'print', 'raise', 'return', 'try', 'while', 'with', 'yield']

  • 变量名最好能让人明了该变量是用来做什么的

     

    5、程序中的注释

    # 单行注释      '''多行注释''' or """多行注释"""

    6、用户交互

    input用来接收用户的输入

    e.g:

    >>> a = input("请输入:")
    请输入:123
    >>> print(a)
    123

    注意:input默认的数据类型为字符型,使用int()可以将其转换为整型

    使用type()可以查看变量的数据类型,e.g:

    >>> a = "abc"
    >>> print(type(a))
    <class 'str'>

    输出小技巧:格式化输出

    e.g:

    name = "Python"
    age = 28
    print("Name is %s,Age is %s"%(name,age))    #%s字符串  %d 整数  %f 浮点
    print("Name is {_name},Age is {_age}".format(_name=name,_age=age))
    
    #结果
    Name is Python,Age is 28
    Name is Python,Age is 28

    小技巧:密文输入

    需导入getpass模块,使输入的内容不可见

    e.g:

    >>> getpass.getpass("请输入密码:")
    请输入密码:    #看不见我看不见我
    'assdfghh'

    7、if…else语句

    if 条件:  #如果
        代码块
    else:   #否则
        代码块
    if 条件:  #如果
        代码块
    elif 条件:    #或者
        代码块
    else:   #否则
        代码块

    8、while循环

    while 条件:
        代码块
     
    #continue 跳出本次循环,进入下次循环

    #break 结束整个循环

    python中while可以搭配else使用,e.g:

    a = 5
    while a<6:
        if a/2 == 1:
            break
        a += 1
    else:
        print("我就是else!")
    
    #结果
    我就是else!

    9、for循环

    e.g:

    for i in range(3):
        print(i)
        i += 1
    #结果

    0
    1
    2

    for i in range(1,3):
        print(i)
        i += 1
    
    #结果
    1
    2
    for i in range(1,5,2):
        print(i)
        i += 1
    
    #结果
    1
    3

    for循环中也有continue和break方法

    10、python中的模块

    Python有非常丰富和强大的标准库和第三方库

    import 模块
    #程序开头加上该代码,加载某个模块,接下去就可以使用该模块提供的功能

    11、python数据类型

    数字:int(整型)、float(浮点)、complex(复数)

    布尔值:True 、False

    字符串:”Python”

    12、python数据运算

    算术运算

    1算术运算

    比较运算

    2比较运算

    赋值运算

    3赋值运算

    按位运算

    4按位运算

    逻辑运算

    5逻辑运算

    成员运算

    6成员运算

    身份运算

    7身份运算

    运算优先级

    8运算优先级

    三元运算

    e.g:

    name = "Python"
    if 1>0:
        name = "Python"
    else:
        name = "JAVA"
    print(name)
    
    #结果
    Python
    
    name = "Python"
    if 1 == 0:
        name = "Python"
    else:
        name = "JAVA"
    print(name)
    
    #结果
    JAVA

    13、列表

    列表是有序的,依靠下标来取值。

    >>> name = ["Python","JAVA","C++"]
    #定义一个列表
    
    >>> name[0]
    'Python'
    >>> name[1]
    'JAVA'
    >>> name[-1]
    'C++'
    >>> name[-2]
    'JAVA'
    #通过列表的下标来取值,下标从0开始,负数下标从列表的最后一个开始计算,从-1开始

    切片

    >>> name = ["Python","JAVA","C++","C","C#"]
    >>> name[0:2]
    ['Python', 'JAVA']
    #列表的切片,从下标0取到下标1(结束的位置不包括)
    >>> name[:2]
    ['Python', 'JAVA']
    #下标为0时可以不写
    
    #注意负数下标
    >>> name[-3:]
    ['C++', 'C', 'C#']
    >>> name[-3:-1]
    ['C++', 'C']
    #使用负数下标切片时,仍然从右到左计算,下标-1不写时,取到-1下标的值,写的时候则不包括-1下标的值
    
    >>> name[0:-1:2]
    ['Python', 'C++']
    >>> name[::2]
    ['Python', 'C++', 'C#']
    #同上的负数下标,注意区别,第三个值为步长

    追加

    >>> name.append("Perl")
    >>> name
    ['Python', 'JAVA', 'C++', 'C', 'C#', 'Perl']

    插入新值

    >>> name.insert(2,"Ruby")
    >>> name
    ['Python', 'JAVA', 'Ruby', 'C++', 'C', 'C#', 'Perl']
    >>> name.insert(-1,"Lisp")
    >>> name
    ['Python', 'JAVA', 'Ruby', 'C++', 'C', 'C#', 'Lisp', 'Perl']
    #将新值插入某个值之前

    修改

    >>> name[2] = "PHP"
    >>> name
    ['Python', 'JAVA', 'PHP', 'C++', 'C', 'C#', 'Lisp', 'Perl']

    删除

    >>> name.remove("PHP")
    >>> name
    ['Python', 'JAVA', 'C++', 'C', 'C#', 'Lisp', 'Perl']
    >>> del name[5]
    >>> name
    ['Python', 'JAVA', 'C++', 'C', 'C#', 'Perl']
    >>> name.pop()
    'Perl'
    >>> name
    ['Python', 'JAVA', 'C++', 'C', 'C#']
    >>> name.pop(3)
    'C'
    #pop不加下标时默认删除最后一个值,pop可以返回被删除的值
    >>> name
    ['Python', 'JAVA', 'C++', 'C#']

    其他的一些方法

    >>> name.index("JAVA")
    1
    #返回值的下标
    
    >>> name.count("C++")
    1
    #计数
    
    >>> name
    ['Python', 'JAVA', 'C++', 'C#']
    >>> name.reverse()
    >>> name
    ['C#', 'C++', 'JAVA', 'Python']
    #翻转整个列表
    
    >>> name
    ['Python', 'JAVA', 'C++', 'C#']
    >>> name.sort()
    >>> name
    ['C#', 'C++', 'JAVA', 'Python']
    #列表的排序
    
    >>> a = ["a","b","c"]
    >>> name.extend(a)
    >>> name
    ['C#', 'C++', 'JAVA', 'Python', 'a', 'b', 'c']
    #合并两个列表
    
    >>> a.clear()
    >>> a
    []
    #清除整个列表的值
    
    >>> name_copy = name.copy()
    >>> name_copy
    ['C#', 'C++', 'JAVA', 'Python', 'a', 'b', 'c']
    #复制列表

    列表的嵌套

    >>> name = ["Python",[1,2,3],"JAVA","C++"]
    >>> name
    ['Python', [1, 2, 3], 'JAVA', 'C++']
    >>> name[1][2]
    3

    列表的循环

    name = ["Python","JAVA","C++"]
    for i in name:
        print(i)
    
    #结果
    Python
    JAVA
    C++

    小技巧

    name = ["Python","JAVA","C++"]
    for index,item in enumerate(name):
        print(index,item)
    
    #结果
    0 Python
    1 JAVA
    2 C++
    #同时循环列表的下标及值

    14、元组

    元组是不可修改的列表,也叫只读列表

    >>> name = ("Python","JAVA","C++")
    >>> name
    ('Python', 'JAVA', 'C++')
    #创建一个元组

    元组只有count与index

    >>> name.count("C++")
    1
    >>> name.index("C++")
    2

    list(),将元组转换为一个列表

    >>> a = list(name)
    >>> a
    ['Python', 'JAVA', 'C++']

    小技巧,无关元组

    \033[31,32;1m%s\033[0m,对%s着色

    15、字符串的常用操作

    字符串可以使用下标和切片操作。

.upper()/lower()  #返回一个新字符串,其中原字符串的所有字母都被相应地转换为大写或小写。
.startswith()/.endswith() #返回 True, 如果它们所调用的字符串以该方法传入的字符串开始或结束。
>>> a = "a:b:c:d:e:f"
>>> a.split(":")
['a', 'b', 'c', 'd', 'e', 'f']
a.strip()  #删除字符串两边的空白字符(空格、制表符和换行符)
a.rstrip()  #删除字符串右边的空白字符(空格、制表符和换行符)
a.lstrip()  #删除字符串左边的空白字符(空格、制表符和换行符)
>>> a = "{'a':'b','c':'d'}"
>>> type(a)
<class 'str'>
>>> b = eval(a)
>>> b
{'a': 'b', 'c': 'd'}
>>> type(b)
<class 'dict'>
#将格式化的字符串转换成字典,同理可以转换列表跟元组
name = "Python"
name.capitalize()  #首字母大写
name.casefold()   #大写全部变小写
name.ljust(50,"-") #输出'Python---------------------------'
name.center(50,"-")  #输出 '---------------------Python----------------------'
name..rjust(50,"-") #输出'--------------------Python'
name.count('t') #统计t出现次数
name.encode()  #将字符串编码成bytes格式
name.endswith("n")  #判断字符串是否以n结尾
 "Pyt\thon".expandtabs(10) #输出'Pyt      hon', 将\t转换成多长的空格 
 name.find('y')  #查找y,找到返回其索引, 找不到返回-1
name.index('y')  #返回y所在字符串的索引
'9aA'.isalnum()   #判断是否是字母和数字
'9'.isdigit() #判断是否整数
name.isnumeric #方法检测字符串是否只由数字组成。这种方法是只针对unicode对象。 
name.isprintable #判断是否为可打印字符串
name.isspace  #判断是否为空格
name.istitle  #判断是否首字母大写,其他字母小写
name.islower()/isupper() #判断是否为小写/大写
>>> "|".join(['Python', 'JAVA', 'C++'])
'Python|JAVA|C++'
>>> a = "a:b:c:d:e:f"
>>> a.partition(":")
('a', ':', 'b:c:d:e:f')
.replace(old,new,x)  #将第x个字符替换
.swapcase #大小写互换
.zfill() #返回指定长度的字符串,原字符串右对齐,前面填充0
.isidentifier() #检测一段字符串可否被当作标志符,即是否符合变量命名规则

16、字典

字典:键-值(key - value),key唯一,无序

>>> a = {"福建":"福州","广东":"广州","江西":"南昌"}
>>> a
{'福建': '福州', '广东': '广州', '江西': '南昌'}
#创建一个字典

>>> a["广西"] = "南宁"
>>> a
{'福建': '福州', '广东': '广州', '江西': '南昌', '广西': '南宁'}
#增加

>>> a["广西"] = "广西"
>>> a
{'福建': '福州', '广东': '广州', '江西': '南昌', '广西': '广西'}
#修改

>>> a.pop("广西")
'广西'
>>> a
{'福建': '福州', '广东': '广州', '江西': '南昌'}
>>> del a["江西"]
>>> a
{'福建': '福州', '广东': '广州'}
#删除

>>> a = {"福建":"福州","广东":"广州","江西":"南昌"}
>>> a.popitem()
('江西', '南昌')
#随机删除

>>> a = {"福建":"福州","广东":"广州","江西":"南昌"}
>>> "福建" in a
True
#查找

>>> a.get("福建")
'福州'
>>> a["福建"]
'福州'
#取某个键的值,使用get方法如果键不存在则返回None,直接取键不存在则报错

>>> a.values()
dict_values(['福州', '广州', '南昌'])
>>> a.keys()
dict_keys(['福建', '广东', '江西'])
>>> a.items()
dict_items([('福建', '福州'), ('广东', '广州'), ('江西', '南昌')])
>>> b = list(a.items())
>>> b
[('福建', '福州'), ('广东', '广州'), ('江西', '南昌')]
#返回值可以用于循环

>>> a.setdefault("福建")
'福州'
>>> a.setdefault("福建","南宁")
'福州'
>>> a.setdefault("广西","南宁")
'南宁'
>>> a
{'福建': '福州', '广东': '广州', '江西': '南昌', '广西': '南宁'}
#不存在则增加,存在则返回该键的值

>>> b
{1, 2, 3}
>>> b = {1:2,3:4,5:6}
>>> a.update(b)
>>> a
{'福建': '福州', '广东': '广州', '江西': '南昌', '广西': '南宁', 1: 2, 3: 4, 5: 6}
#合并两个字典

>>> a = dict.fromkeys([1,2,3],"abc")
>>> a
{1: 'abc', 2: 'abc', 3: 'abc'}

a = {"福建":"福州","广东":"广州","江西":"南昌"}
for i in a:
    print(i,a[i])
#字典的循环,结果
福建 福州
广东 广州
江西 南昌

17、集合

集合是一个无序的,不重复的数据组合。作用:

  • 去重,把列表变成集合,自动去重
  • 关系测试,取交集、并集等关系
s = set([3,5,9,10])      #创建一个数值集合    
t = set("Hello")         #创建一个唯一字符的集合    
t.add('x')            # 添加一项  
s.update([10,37,42])  # 添加多项  
t.remove('H') # 删除
len(s) #长度  
s.copy() #返回 set “s”的一个浅复制
x in s  #测试 x 是否是 s 的成员  
x not in s  #测试 x 是否不是 s 的成员
 
s.issubset(t)  
s <= t  
#测试是否 s 中的每一个元素都在 t 中  
s.issuperset(t)  
s >= t  
#测试是否 t 中的每一个元素都在 s 中  
s.union(t)  
s | t  
#返回一个新的 set 包含 s 和 t 中的每一个元素  
s.intersection(t)  
s & t  
#返回一个新的 set 包含 s 和 t 中的公共元素  
s.difference(t)  
s - t  
#返回一个新的 set 包含 s 中有但是 t 中没有的元素  
s.symmetric_difference(t)  
s ^ t  
#返回一个新的 set 包含 s 和 t 中不重复的元素  

18、文件操作

文件的常用操作

f =  open("文件名","模式")
#打开文件,模式有以下几种:
r 只读模式(默认)
w 只写模式(文件不存在则建立,文件存在则覆盖)
a 追加模式(文件不存在则建立,文件存在则追加)
r+ 读写模式(可读可写可追加)
w+ 写读模式
a+ 追加读模式
rb、wb、ab 处理二进制文件
U 将\r \n \r\n自动转换成\n(与r或r+模式同时使用)

f.read()  #读文件
f.readline() #读一行
f.readlines() #将文件每一行读如一个列表

f.write() #将内容写入文件

f.close() #关闭文件

f.tell()  #返回指针位置,按文件中字符的个数计算
f.seek()  #回到某个指针位置

f.encoding() #返回文件所使用的编码

文件的其他一些操作

f.readable()  #判断文件是否可读
f.writeable()  #判断文件是否可写
f.closed()  #判断文件是否关闭
f.seekable()   #判断是否可以移动指针 
f.name()   #返回文件名
f.isatty()    #如果文件连接到一个终端设备返回 True,否则返回 False
f.flush()   #将缓存内容写入硬盘
f.truncate()  #从头开始截断文件
for line in f:
    print(line)
#将文件一行行读入内存,一次只在内存中保存一行

with open("文件名","模式") as f:
#为防止打开文件之后忘记关闭,使用该方法在with代码块执行完毕之后自动关闭释放文件资源

with open("文件名","模式") as f1,open("文件名","模式") as f2:
#支持对多个文件进行操作

19、字符的编码与转码

encode:编码 decode:转码

GBK-->UTF-8:GBK--decode-->Unicode--encode-->UTF-8

UTF-8-->GBK:UTF-8--decode-->Unicode--encode—>GBK

两个不同编码相互转换都需要经过Unicode。

.decode(原编码)

.encode(转换后编码)

python 3.x默认为UTF-8编码。

在python 3.x中encode,在转码的同时还会把string变成bytes类型,decode在解码的同时还会把bytes变回string。

20、函数

使用函数的意义:

  • 减少重复的代码
  • 保持一致性,使代码更容易修改
  • 使程序更容易扩展
def 函数名(形参):
    '''文档描述'''
    代码块
    return #返回执行结果,可返回多个值,默认返回None
#定义一个函数

位置参数,关键字参数,默认参数,e.g:

def test(x,y):
    print(x)
    print(y)
    return
test(1,2)
#位置参数,将函数所获得的参数按照一一对应的位置传入,输出结果为
1
2

def test(x,y):
    print(x)
    print(y)
    return
test(x=1,y=2)
#关键字参数,按照关键字将值传入,输出结果为
1
2

def test(x,y):
    print(x)
    print(y)
    return
test(1,y=2)
#位置参数与关键字参数一起使用,注意:关键字参数不能放在位置参数之前,输出结果为
1
2

def test(x,y,z=3):
    print(x)
    print(y)
    print(z)
    return
test(1,y=2)
#默认参数,直接在定义函数的时候赋值,可以在调用函数的时候修改,输出结果为
1
2
3

非固定参数

def test(*args):
    print(args)
    return
test(1,2)
test(1,2,3)
test(*[1,2,3,4])
#非固定参数,可以传入不同个数的参数,只能接受位置参数,以元组的方式输出,结果
(1, 2)
(1, 2, 3)
(1, 2, 3, 4)

def test(**args):
    print(args)
    return
test(x=1,y=2)
test(x=1,y=2,z=3)
#非固定参数,以字典的方式输出,只接受关键字参数,结果
{'x': 1, 'y': 2}
{'x': 1, 'y': 2, 'z': 3}

21、作用域、局部与全局变量

在子程序中定义的变量称为局部变量,在程序的一开始定义的变量称为全局变量。

全局变量作用域是整个程序,局部变量作用域是定义该变量的子程序。

当全局变量与局部变量同名时,在定义局部变量的子程序内,局部变量起作用,在其它地方全局变量起作用

22、递归与高阶函数

递归

一个函数在内部调用自身,该函数即为递归函数

特性:

  • 必须有一个明确的结束条件
  • 每次进入更深一层递归时,问题规模相比上次递归都应该有所减少
  • 递归效率不高,递归层次过多会导致栈溢出

高阶函数

变量可以指向函数,函数的参数能够接收变量,那么一个函数就可以接收另一个函数作为参数,这种函数称为高阶函数。e.g:

def add(x,y,f):
    return f(x)+f(y)
res = add(3,-6,abs)
print(res)
#结果
9

posted on 2017-09-26 09:38  青蛙二世  阅读(475)  评论(0编辑  收藏  举报

导航