美文网首页硬核智能
Python 编程速成

Python 编程速成

作者: 疯狂的技术宅 | 来源:发表于2019-04-24 21:43 被阅读5次

    Python是一种非常流行的脚本语言,而且功能非常强大,几乎可以做任何事情,比如爬虫、网络工具、科学计算、树莓派、Web开发、游戏等各方面都可以派上用场。同时无论在哪种平台上,都可以用 Python 进行系统编程。

    机器学习可以用一些 Python 库来实现,比如人工智能常用的TensorFlow。也可以用像 NLTK 这样的 Python 库进行自然语言处理(NLP)。

    本文讨论基本的 Python 编程,后续会写一些 Python 编程的实际案例。

    操作字符串

    Python 中的字符串是不可变的,所以不能直接修改。对字符串内容的任何更改都需要产生新的副本。
    在 Python 中处理字符串非常简单。

    拼接字符串

    str = "welcome " + "to Python" 
    print (str) 
    

    这是字符串连接,你也可以对字符串做乘法操作:

    重复字符串

    str = "Python" * 2 
    print (str)
    

    与非字符串拼接

    可以用 str() 函数将非字符串的值转换为字符串,然后再连接,如下所示:

    str = "This is test number " + str(15) 
    print (str)
    

    搜索子字符串

    可以使用 find() 方法搜索子字符串,如下所示:

    str = "welcome to Python" 
    print(str.find("Python"))
    

    如果找到了字符串"Python",则 find 方法会返回第一次出现这个字符串的位置。

    如果没有找到,则返回 -1。

    find 函数默认从第一个字符开始搜索,也可以从第n个字符开始,如下所示:

    str = "welcome to Python" 
    print(str.find("Python",12))
    

    因为我们从第12个字符开始,所以找不到 Python 这个单词,所以它会返回 -1。

    获取子字符串

    所以我们得到了我们要搜索的字符串的索引,现在我们要打印匹配的字符串。

    你可以按索输出印字符串,如下所示:

    str = "first second third" 
    print(str[:2]) 
    print(str[2:]) 
    print(str[3:5]) 
    print(str[-1])
    

    在第 2 行的代码会打印第一个和第二个字符,而第 3 行会从第二个字符开始打印到结束。要注意代码中结冒号的位置。字符串从 0 开始计数。
    如果使用负数,则会从最后开始计数。第 5 行代码会打印最后一个字符。

    替换字符串

    你可以用如下方法替换字符串:

    str = "This website is about programming" 
    str2 = str.replace("This", "That") 
    print(str2)
    

    如果你想替换的字符串多次出现,但是只想替换第一次出现的,可以指定位置:

    str = "This website is about programming I like this website" 
    str2 = str.replace("website", "page",1) 
    print(str2)
    

    第一个词只被替换了。

    去除字符串两端的空格

    可以用 strip 方法去掉字符串两端的空格,如下所示:

    str = "   This website is about programming    "
    print(str.strip())
    

    你可以用rstrip仅去除最右的空格,或者用 lstrip 去除最左边的空格。

    改变字符大小写

    在某些情况下你可能需要改变字符的大小写。

    str="Welcome to likegeeks" 
    print(str.upper()) 
    print(str.lower())
    

    将字符串转换为数字

    前面学到了用 str()函数将数字转为字符串,但这不是 Python 中唯一的转换函数,另外还有 int()float()long()和其他强制转换函数。

    int() 可以把输入的字符串转为整数,float() 函数将字符串转为float。

    str="10" 
    str2="20" 
    print(str+str2) 
    print(int(str)+int(str2))
    

    第 3 行只是连接两个字符串,而第 4 行把两个值相加并输出结果。

    字符串计数

    可以用min()找到字符串中 ASCII 值最小的字符,max()找到最大的字符,用len()函数得到字符的总长度。

    str="welcome to Python" 
    print(min(str)) 
    print(max(str)) 
    print(len(str))
    

    迭代字符串

    可以用 for 迭代字符串并单独操作每个字符,如下所示:

    str="welcome to likegeeks website" 
    for i in range(len(str)):
        print(str[i])
    

    其中 len() 函数用来得到字符串的长度。

    字符串编码

    如果你使用的是Python 3,默认情况下所有字符都是 Unicode 字符集编码,但是如果用的是Python 2,可能需要对字符串进行编码,如下所示:

    str="welcome to Python" 
    str.encode('utf-8')
    

    操作数字

    在 Python 中定义数字变量的方式如下:

    a=15

    可以定义整数,也可以定义浮点数。
    浮点数可以用 int()函数进行舍入,如下所示:

    a=15.5 
    print(int(a))
    

    舍入数字

    可以用 round() 函数对数字进行舍入:

    a=15.5652645
    print(round(a,2))
    

    只需指定需要舍入到小数点后几位。

    自定义精度的数字

    很多情况下会用到自定义精度的浮点数。

    可以处理用户自定义精度数的 decimal 模块。

    这样导入模块并使用:

    from decimal import *
    
    a=Decimal(5.5)
    

    生成随机数

    Python 中的 random 模块提供了生成随机数的函数。

    import random 
    
    print(random.random())
    

    生成的随机数介于 0.0 和 1.0 之间。

    可以从自己定义的范围中生成一个随机数,如下所示:

    import random
    
    numbers=[1,2,3,4,5,6,7]
    print(random.choices(numbers))
    

    操作日期和时间

    你可以从日期中提取所需的值,如下所示。

    import datetime 
    
    cur_date = datetime.datetime.now() 
    print(cur_date) 
    print(cur_date.year) 
    print(cur_date.day) 
    print(cur_date.weekday()) 
    print(cur_date.month) 
    print(cur_date.time())
    

    可以得到两个时间或日期之间的差,如下所示:

    import datetime 
    
    time1 = datetime.datetime.now() 
    time2 = datetime.datetime.now() 
    timediff = time2 - time1 
    print(timediff.microseconds())
    

    上例中的 timediff 变量是 timedelta 类型的对象,你也可以自己创建这种对象:

    time1 = datetime.datetime.now() 
    time2 = datetime.timedelta(days=3) 
    time3=time1+time2 
    print(time3.date())
    

    格式化日期和时间

    可以用 strftime() 格式化日期或时间。

    下表指定了一些常用的格式选项:

    • %y 两位数的年份表示(00-99)
    • %Y 四位数的年份表示(000-9999)
    • %m 月份(01-12)
    • %d 月内中的一天(0-31)
    • %H 24小时制小时数(0-23)
    • %I 12小时制小时数(01-12)
    • %M 分钟数(00=59)
    • %S 秒(00-59)
    • %a 本地简化星期名称
    • %A 本地完整星期名称
    • %b 本地简化的月份名称
    • %B 本地完整的月份名称
    • %c 本地相应的日期表示和时间表示
    • %j 年内的一天(001-366)
    • %p 本地A.M.或P.M.的等价符
    • %U 一年中的星期数(00-53)星期天为星期的开始
    • %w 星期(0-6),星期天为星期的开始
    • %W 一年中的星期数(00-53)星期一为星期的开始
    • %x 本地相应的日期表示
    • %X 本地相应的时间表示
    • %Z 当前时区的名称
    • %% %号本身
    import datetime 
    
    date1 = datetime.datetime.now() 
    print(date1.strftime('%d. %B %Y %I:%M%p'))
    

    从字符串创建日期

    可以用 strptime()函数从字符串创建日期,如下所示:

    date1=datetime.datetime.strptime(“2015-11-21”, “%Y-%m-%d”)

    也可以像这样创建:

    date1= datetime.datetime(year=2015, month=11, day=21)

    处理文件系统

    在 Python 中处理文件非常容易,不管你信不信,在所欲语言中是是最简单的。当然你也可以说 Python 是一种做什么事情都最简单的语言。

    复制文件

    shutil 模块中包含用于复制文件的功能。

    import shutil 
    copied_path = shutil.copy('my_file.txt', 'copied_file.txt')
    

    如果 my_file.txt 是一个软连接的话,那么上面的代码将会把 copied_file.txt 创建为独立的文件。

    你也可以创建一个软链接的副本,如下所示:

    copied_path = shutil.copy('my_file.txt', 'copied_file.txt',follow_symlinks=False)

    移动文件

    你可以像这样移动一个文件:

    import shutil 
    shutil.move('file1.txt', 'file3.txt')
    

    也可以使用 os 模块中的 rename 函数重命名文件,如下所示:

    import os 
    os.rename('file1.txt', 'file3.txt')
    

    读写文本文件

    可以用 open 函数打开文件,然后再用 readwrite 方法进行读写。

    fd = open('file1.txt') 
    content = fd.read() 
    print(content)
    

    首先,使用 open 函数打开文件并读取,然后我再用 read 函数读取文件内容,最后,将得到的内容放入变量 content 中。

    你可以指定 read()()函数读取的字节数:

    fd.read(20)

    如果文件不是太大的话,你可以将整个内容读入一个列表,然后再遍历列表打印输出。

    content = fd.readlines() 
    print(content[0])
    

    可以通过指定打开的模式来写入文件。有两种写入模式,即写入模式和追加模式。

    下面是写入模式,会覆盖掉文件中的旧内容。

    fd = open('file1.txt','w') 
    content = fd.write('YOUR CONTENT GOES HERE')
    

    下面是附加模式:

    fd = open('file1.txt','a') 
    content = fd.write('YOUR CONTENT GOES HERE')
    

    创建目录

    可以用 os模块中的 mkdir 函数创建一个新目录,如下所示:

    import os 
    
    os.mkdir('./NewFolder)
    

    如果目录已经存在将会引发错误。不过不用担心,在以后的文章中会讨论异常处理,可以帮你避免此类错误。

    获取访问和修改以及创建时间

    可以用 getmtime()getatime()getctime() 分别获取修改时间、访问时间和创建时间。

    返回的时间格式为 Unix 时间戳,我们可以把它转换为人类可读的格式,如下所示:

    import os 
    import datetime 
    
    tim=os.path.getctime('./file1.txt') 
    print(datetime.datetime.fromtimestamp(tim))
    

    迭代文件

    你可以用 os 模块中的 listdir() 函数来获取文件:

    import os
    
    files = os.listdir('.')
    print(files)
    

    此外,你可以用 glob 模块执行相同的操作:

    import glob 
    files = glob.glob('*') 
    print(files)
    

    你可以为 glob()设定任何一种扩展名,例如设定为 * .doc 获取所有word文档。

    序列化Python对象

    此过程用于将 Python 对象序列化为字节流,以便以后重用。

    你可以用 pickle 模块做到这一点:

    import pickle 
    
    fd = open('myfile.pk ', 'wb') 
    pickle.dump(mydata,fd)
    

    可以用 load() 函数反序列化此数据,如下所示:

    import pickle 
    
    fd = open('myfile.pk ', 'rb') 
    mydata = pickle.load(fd)
    

    压缩文件

    Python 标准库使你可以处理不同格式的压缩文件,如tar,zip,gzip,bzip2。

    要处理 zip文件,你可以使用 zipfile模块:

    import zipfile 
    
    my_zip = zipfile.ZipFile('zipped_file.zip', mode='r') 
    print(file.namelist())
    

    你可以把一个文件压缩成 zip 格式,如下所示:

    import zipfile 
    
    file=zipfile.ZipFile('files.zip','w') 
    file.write('file1.txt') 
    file.close()
    

    可以用 extractall() 方法提取 zip 压缩包中的文件:

    import zipfile 
    
    file=zipfile.ZipFile('files.zip','r') 
    file.extractall() 
    file.close()
    

    另外还可以用附加模式将文件附加到现有的zip文件,如下所示:

    import zipfile 
    
    file=zipfile.ZipFile('files.zip','a') 
    file.write('file2.txt') 
    file.close()
    

    在处理 gz 或 bz 文件时,可以用和上面相同的套路。不过要导入 gzip 模块或 bz2 模块。

    import gzip 
    import bz2 
    
    gz_file=gzip.GzipFile('files.gz','r') 
    bz_file=bz2.BZ2File('fiels.bz2','r')
    

    然后用同样的方式读写。

    你可以使用 unrar 包处理rar文件。首先,安装包:

    pip install unrar
    

    然后用同样的方式使用。

    import unrar.rarfile 
    
    m=unrar.rarfile.RarFile('file.rar') 
    m.namelist() 
    m.extractall()
    

    解析CSV文件

    一个非常有用的包叫做 pandas。它可以解析 CSV 和 Excel 文件,并轻松地从中提取数据。

    首先,安装包

    pip install pandas
    

    然后你可以在自己的代码中使用它,如下所示:

    import pandas 
    
    data=pandas.read_csv('file.csv)
    

    默认情况下,Pandas 将第一列视为每行的标签。如果列索引不是第一列,则可以通过传递 index_col 参数来指定列索引。

    如果文档中没有行标签,则应使用参数 index_col = False

    要写入CSV文件,可以使用 to_csv() 方法。

    data.to_csv('file.csv)

    解析Excel文件

    可以用 pandas 模块中的 read_excel() 方法来解析excel文件。

    data = pd.read_excel('file.xls', sheetname='Sheet1')

    如果有多个工作表,可以这样加载:

    ta = pd.ExcelFile('file.xls')

    这样写入excel文件:

    ta.to_excel('file.xls', sheet='Sheet1')

    网络和连接

    Python 有一个 socket 类,它提供了一种通过低级 API 访问网络的方法,它支持许多网络协议。

    import socket 
    host = '192.168.1.5' 
    port = 5050 
    m_sock = socket.create_connection ((host, port))
    

    这段代码与 IP 地址为 192.168.1.5 的主机通过 5050 端口建立连接。

    打开 socket 后,就可以发送和接收数据了。

    m_sock.sendall(b'Hello World')

    注意,我在字符串之前使用了 b 字符,因为数据需要是字节字符串。

    如果发送的数据太大,你应该通过循环分割并发送,如下所示:

    msg = b'Longer Message Goes Here' 
    mesglen = len(msg)
    total = 0
    while total < msglen: 
        sent = m_sock.send(msg[total:])
        total = total + sent
    

    要接收数据,你需要告诉 recv() 方法一次读入多少个字节。

    data_in = m_sock.recv(2000)

    这是有效的,因为你能够确定发送的消息长度小于2000个字节。

    如果消息很大,则必须反复循环,直到收到所有的数据块。

    buffer = bytearray(b' ' * 2000) 
    m_sock.recv_into(buffer)
    

    在这里定义了一个空缓冲区,然后将消息写入缓冲区。

    从POP邮件服务器接收电子邮件

    poplib 模块使你可以与 POP 服务器进行通信。

    import getpass,poplib 
    
    pop_serv = poplib.POP3('192.168.1.5') 
    pop_serv.user("myuser") 
    pop_serv.pass_(getpass.getpass())
    

    getpass 模块可以安全地处理密码。

    如果需要安全连接,可以用 POP3_SSL 类。

    要获取邮件列表和邮件计数,可以这样做:

    msg_list = pop_serv.list()        # to list the messages 
    msg_count = pop_serv.msg_count()  # to get message count
    

    处理完毕后,一定要记得关闭所有打开的连接。

    pop_serv.quit()

    从IMAP邮件服务器接收电子邮件

    可以用 imaplib 模块与 IMAP 邮件服务器通信。

    import imaplib, getpass 
    
    my_imap = imaplib.IMAP4('imap.server.com') 
    my_imap.login("myuser", getpass.getpass())
    

    如果你的 IMAP 服务器上使用 SSL,则应用 IMAP4_SSL 类。

    要获取电子邮件列表,需要先执行查询操作:

    data = my_imap.search(None, 'ALL')

    然后,通过迭代 data 变量中的邮件索引获取邮件内容

    msg = my_imap.fetch(email_id, '(RFC822)')

    最后,不要忘记关闭连接:

    my_imap.close() 
    my_imap.logout()
    

    发送电子邮件

    想要通过 SMTP 协议发送电子邮件。可以用 smtplib

    import smtplib, getpass 
    
    my_smtp = smtplib.SMTP(smtp.server.com') 
    my_smtp.login("myuser", getpass.getpass())
    

    如果在 SMTP服务器上使用SSL,则应用 SMTP_SSL 类。

    打开连接后,你可以这样发送邮件:

    from_addr = 'me@example.com' 
    to_addr = 'you@example.com' 
    msg = 'From: me@example.com\r\nTo: you@example.com\r\n\r\nHello, this is a test message' 
    my_smtp.sendmail(from_addr, to_addr, msg)
    

    抓取网页

    要与Web服务器进行通信,需要用到 urllib.request 子模块。

    import urllib.request 
    
    my_web = urllib.request.urlopen('https://www.google.com') 
    print(my_web.read())
    

    提交 Web 表单

    如果你想要提交 Web 表单,应该向网页发送POST请求。

    import urllib.request 
    my_data = b'Your Data Goes Here' 
    my_req = urllib.request.Request('http://localhost', data=my_data,method='POST') 
    my_frm = urllib.request.urlopen(my_req) 
    print(my_frm.status)
    

    另外还可以用 mechanize 或 urllib2 模块,还有很多方法可以实现这个功能。

    创建一个微型服务器

    socket 类支持侦听连接请求。

    import socket 
    
    host = ''
    port = 3535 
    my_server = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
    my_server.bind((host, port)) 
    my_server.listen(1)
    

    现在你可以接受这样的连接请求:

    addr = my_server.accept() 
    print('Connected ... ', addr) 
    data = conn.recv(1024)
    

    最后不要忘记在操作完成后关闭连接

    conn.close()

    Python 中的线程

    并发运行任务是非常有用的,Python 有一个名为 threading 的模块,它包含一个 Thread 类。

    import threading 
    
    def print_message():     
        print('The message got printed from a different thread') 
    
    my_thread = threading.Thread(target=print_message) 
    my_thread.start()
    

    如果函数需要很长时间才能完成,可以用 is_alive()方法检查它是否仍在运行。

    有时你的线程需要安全地访问全局资源。这时候就需要用到锁。

    import threading
    
    num = 1 
    my_lock = threading.Lock()
    
    def my_func():
        global num, my_lock
        my_lock.acquire()
        sum = num + 1
        print(sum)
        my_lock.release() 
    
    my_thread = threading.Thread(target=my_func)
    my_thread.start()
    

    使用树莓派

    使用树莓派是一种价格便宜的单板电脑,可以在上面开发各种有趣的应用。

    可以用 Python 的 RPi.GPIO 模块使树莓派与外接的传感器通信。

    首先,在你的树莓派中安装包,如下所示:

    $ sudo apt-get install python-dev python-rpi.gpio
    

    然后你就能在Python脚本中使用它了。可以在树莓派的 GPIO 总线上写输出:

    import RPi.GPIO as GPIO 
    
    GPIO.setmode(GPIO.BOARD) 
    GPIO.setup(1, GPIO.OUT, initial=GPIO.LOW) 
    GPIO.output(1, GPIO.HIGH)
    

    通过树莓派的GPIO中读取数据

    你可以用 RPi.GPIO 模块从 GPIO 接口读取数据,如下所示:

    import RPi.GPIO 
    
    RPi.GPIO.setup(1, GPIO.IN)
    if RPi.GPIO.input(1):
        print('Input was HIGH') 
    else:
        print('Input was LOW')
    

    以上只是 Python 的一小部分基础知识,还有很长的路需要走。

    实际上,我们已经介绍了一小部分Python,还有很多内容需要介绍。将来会有更多的文章来帮助大家学习 Python 这种充满魅力的语言,请关注我。

    相关文章

      网友评论

        本文标题:Python 编程速成

        本文链接:https://www.haomeiwen.com/subject/gwnngqtx.html