打破传统 发表于 2024-6-17 00:30

趣味微项目,轻松学Python_1-7章读书心得

<p>从今天开始正式阅读本书的主要内容,开启Python编程之旅。接下来介绍本书1-7章的学习内容和心得。</p>

<p >由于我的环境是windows 下安装的Pycharm ,并且使用的是conda环境下,所以与书中的部分的内容是有出入的,例如书中用的是python3的命令,在我的环境中用的是python命令,书中需要添加释伴行,我的环境中不用添加,因为是在项目设置中已经指定Python解析器的。</p>

<p >本书第一章的内容是如何编写和测试Python程序。下面就从&rdquo;hello world!&rdquo;开始吧!</p>

<p > &nbsp;</p>

<p>主要内容包括: 创建程序、添加注释、怎样写一个测试程序、添加#!释伴行、可执行程序、理解$PATH、添加参数和帮助、可选实参的介绍(argarse模块的使用)、运行测试、添加main()函数、添加get_args()函数、测试hello.py、用new.py开始新程序、使用template.py替代new.py等内容。通过本章学习基本的程序框架就大致理解了,下面就是template.py</p>

<pre>
<code>#!/usr/bin/env python3
"""
Author : Me &lt;me@foo.com&gt;
Date   : today
Purpose: Rock the Casbah
"""

import argparse


# --------------------------------------------------
def get_args():
    """Get command-line arguments"""

    parser = argparse.ArgumentParser(
      description='Rock the Casbah',
      formatter_class=argparse.ArgumentDefaultsHelpFormatter)

    parser.add_argument('positional',
                        metavar='str',
                        help='A positional argument')

    parser.add_argument('-a',
                        '--arg',
                        help='A named string argument',
                        metavar='str',
                        type=str,
                        default='')

    parser.add_argument('-i',
                        '--int',
                        help='A named integer argument',
                        metavar='int',
                        type=int,
                        default=0)

    parser.add_argument('-f',
                        '--file',
                        help='A readable file',
                        metavar='FILE',
                        type=argparse.FileType('r'),
                        default=None)

    parser.add_argument('-o',
                        '--on',
                        help='A boolean flag',
                        action='store_true')

    return parser.parse_args()


# --------------------------------------------------
def main():
    """Make a jazz noise here"""

    args = get_args()
    str_arg = args.arg
    int_arg = args.int
    file_arg = args.file
    flag_arg = args.on
    pos_arg = args.positional

    print(f'str_arg = "{str_arg}"')
    print(f'int_arg = "{int_arg}"')
    print('file_arg = "{}"'.format(file_arg.name if file_arg else ''))
    print(f'flag_arg = "{flag_arg}"')
    print(f'positional = "{pos_arg}"')


# --------------------------------------------------
if __name__ == '__main__':
    main()</code></pre>

<p>第二章内容是使用字符串。作者通过一个荒诞滑稽的小对话引出本章的内容,本章的内容主要是使用字符串。</p>

<p >本章中我们要实现的程序是通过接收单个位置实参,把这个给定的实参连同单词&ldquo;a&rdquo;或&ldquo;an&rdquo;一起打印到&ldquo;Ahoy&rdquo;短语内。</p>

<p >主要内容包括:如何使用测试、用new.py创建程序、重复的编写然后测试、定义实参、串连字符串、变量类型、获取字符串的正确部分、在REPL中找到帮助、字符串方法、字符串比较、条件分支、字符串格式化等内容。</p>

<p >通过本章学习我们能创建一个能接收位置实参并生成使用文档的程序,通过程序的输入创建一个新的输出字符串,运行全套的测试集,最终实现如下:</p>

<pre>
<code>#!/usr/bin/env python3
"""Crow's Nest"""

import argparse


# --------------------------------------------------
def get_args():
    """Get command-line arguments"""

    parser = argparse.ArgumentParser(
      description="Crow's Nest -- choose the correct article",
      formatter_class=argparse.ArgumentDefaultsHelpFormatter)

    parser.add_argument('word', metavar='word', help='A word')

    return parser.parse_args()


# --------------------------------------------------
def main():
    """Make a jazz noise here"""

    args = get_args()
    word = args.word
    article = 'an' if word.lower() in 'aeiou' else 'a'

    print(f'Ahoy, Captain, {article} {word} off the larboard bow!')


# --------------------------------------------------
if __name__ == '__main__':
    main()</code></pre>

<pre>
<code>    main()</code></pre>

<p>第三章内容是使用列表。作者通过举例野餐清单的例子引出本章的内容,如何使用列表。</p>

<p >本章中我们要实现一个接收一个或多个要携带的物品对应的位置实参,还要接收-s或&mdash;sorted标志位来选择是否对这些条目进行排序,输出&ldquo;You are bringing&rdquo; 后跟条目。</p>

<p >主要内容包括:怎么样通过new.py或template.py开始程序的编写、编写picnic.py程序、列表的介绍、怎样向列表中添加一个元素、怎样添加多个元素、怎样对列表进行索引、怎样进行切片化、怎样在列表中查找元素、怎样删除列表中元素、对列表进行排序和反转、变更列表、连接列表、用if/elif/else进行条件分支。</p>

<p >通过本章的学习我们将实现能够接收多个位置实参的程序,使用if /elif/else来处理三个以上选项的条件分支,查找并更改列表中的条目,对列表中的条目进行排序和反转,实现格式化列表为一个新字符串。程序实现如下:</p>

<pre>
<code>#!/usr/bin/env python3
"""Picnic game"""

import argparse


# --------------------------------------------------
def get_args():
    """Get command-line arguments"""

    parser = argparse.ArgumentParser(
      description='Picnic game',
      formatter_class=argparse.ArgumentDefaultsHelpFormatter)

    parser.add_argument('item',
                        metavar='str',
                        nargs='+',
                        help='Item(s) to bring')

    parser.add_argument('-s',
                        '--sorted',
                        action='store_true',
                        help='Sort the items')

    return parser.parse_args()


# --------------------------------------------------
def main():
    """Make a jazz noise here"""

    args = get_args()
    items = args.item
    num = len(items)

    if args.sorted:
      items.sort()

    bringing = ''
    if num == 1:
      bringing = items
    elif num == 2:
      bringing = ' and '.join(items)
    else:
      items[-1] = 'and ' + items[-1]
      bringing = ', '.join(items)

    print('You are bringing {}.'.format(bringing))


# --------------------------------------------------
if __name__ == '__main__':
    main()
</code></pre>

<p>第四章内容是使用字典。作者通过电视剧中的情节引申出本章内容跳5编码算法的实现。</p>

<p >本章中我们要实现一个程序,这个程序接收一些文本作为实参。文本中的每个数字都将用跳5算法编码。其他非数字字符原封不动输出。</p>

<p >主要内容包括:字典的介绍、如何创建字典、如何访问字典的值、字典的方法、编写jump.py、使用dict进行编码、处理序列中条目的5中方法等内容。</p>

<p >通过本章学习我们将学会创建字典、使用for循环和列表推导式来逐个字符地处理文本,检查字典中是否有特定条目,从字典中检索特定值,打印一个新字符串,其中数字被替换成编码值。程序实现如下:</p>

<pre>
<code>#!/usr/bin/env python3
"""Jump the Five"""

import argparse


# --------------------------------------------------
def get_args():
    """Get command-line arguments"""

    parser = argparse.ArgumentParser(
      description='Jump the Five',
      formatter_class=argparse.ArgumentDefaultsHelpFormatter)

    parser.add_argument('text', metavar='str', help='Input text')

    return parser.parse_args()


# --------------------------------------------------
def main():
    """Make a jazz noise here"""

    args = get_args()
    jumper = {'1': '9', '2': '8', '3': '7', '4': '6', '5': '0',
            '6': '4', '7': '3', '8': '2', '9': '1', '0': '5'}

    for char in args.text:
      print(jumper.get(char, char), end='')
    print()


# --------------------------------------------------
if __name__ == '__main__':
    main()</code></pre>

<p>第五章内容是使用文件和STDOUT。作者通过《哈利波特》中的&ldquo;吼叫信&rdquo;引出本章的内容文件实参的使用。</p>

<p >本章中我们要实现一个程序。当你向程序中输入&ldquo;How dare you steal that car!&rdquo;程序输出为&ldquo;HOW DARE YOU STEAL THAT CAR!&rdquo;。</p>

<p >主要内容包括:怎样读取文件、怎样写入文件、编写howler.py、从文件或命令行读取输入、选择输出文件句柄、低内存版本等内容。</p>

<p >通过本章学习我们将学会接收命令行或文件中的文本输入、将字符串改为大小、将输出打印到命令行或文件中、像处理文件句柄一样处理纯文本。程序实现如下:</p>

<pre>
<code>#!/usr/bin/env python3
"""Howler"""

import argparse
import os
import sys


# --------------------------------------------------
def get_args():
    """get command-line arguments"""

    parser = argparse.ArgumentParser(
      description='Howler (upper-cases input)',
      formatter_class=argparse.ArgumentDefaultsHelpFormatter)

    parser.add_argument('text',
                        metavar='text',
                        type=str,
                        help='Input string or file')

    parser.add_argument('-o',
                        '--outfile',
                        help='Output filename',
                        metavar='str',
                        type=str,
                        default='')

    args = parser.parse_args()

    if os.path.isfile(args.text):
      args.text = open(args.text).read().rstrip()

    return args


# --------------------------------------------------
def main():
    """Make a jazz noise here"""

    args = get_args()
    out_fh = open(args.outfile, 'wt') if args.outfile else sys.stdout
    out_fh.write(args.text.upper() + '\n')
    out_fh.close()


# --------------------------------------------------
if __name__ == '__main__':
    main()
</code></pre>

<p>第六章内容是读取文件和STDIN,迭代列表,格式化字符串。作者通过数数来引出本章内容。</p>

<p >本章中我们要实现一个WC程序。它将计算每个输入中的行数、单词数和字节数。</p>

<p >主要内容包括:编写wc.py、定义文件输入、迭代列表、数什么、格式化结果、使用for循环读入一个文件等内容。</p>

<p >通过本章学习,我们将学会如何处理零个或多个位置实参、验证输入文件、从文件或标准输入中读取数据、使用多层for循环、将文件分解为行、单词和字节、使用计数器变量、格式化字符串输出结果。程序实现如下:</p>

<pre>
<code>#!/usr/bin/env python3
"""Emulate wc (word count)"""

import argparse
import sys


# --------------------------------------------------
def get_args():
    """Get command-line arguments"""

    parser = argparse.ArgumentParser(
      description='Emulate wc (word count)',
      formatter_class=argparse.ArgumentDefaultsHelpFormatter)

    parser.add_argument('file',
                        metavar='FILE',
                        nargs='*',
                        default=,
                        type=argparse.FileType('rt'),
                        help='Input file(s)')

    return parser.parse_args()


# --------------------------------------------------
def main():
    """Make a jazz noise here"""

    args = get_args()

    total_lines, total_bytes, total_words = 0, 0, 0
    for fh in args.file:
      num_lines, num_words, num_bytes = 0, 0, 0
      for line in fh:
            num_lines += 1
            num_bytes += len(line)
            num_words += len(line.split())

      total_lines += num_lines
      total_bytes += num_bytes
      total_words += num_words

      print(f'{num_lines:8}{num_words:8}{num_bytes:8} {fh.name}')

    if len(args.file) &gt; 1:
      print(f'{total_lines:8}{total_words:8}{total_bytes:8} total')


# --------------------------------------------------
if __name__ == '__main__':
    main()
</code></pre>

<p>第七章内容是在字典中查找条目。作者通过Edward Gorey的The Gashlycrumb Tinies 这本书引出本章内容。</p>

<p >本章我们要实现一个程序。这个程序将接收一个或多个字母作为位置实参,并从一个可选的输入文件中查找以该字母开头的文本行。</p>

<p >主要内容包括:编写gashlycrumb.py、读取输入文件、使用字典推导式、lookup字典等内容。通过本章学习,我们将学会接收一个或多个位置参数letter(字母)、接收一个可选的&mdash;file参数,它必须是一个可读文本文件,默认值是gashlycrumb.txt、读取文件找到每行的第一个字母,并建立一个数据结构与该字母对应的文本行相关联、对于用户提供的每个letter,如果存在该字母对应的文本行,则将其打印出来,如果不存在则打印一条消息、美观的打印数据结构代码。程序实现如下:</p>

<pre>
<code>#!/usr/bin/env python3
"""Lookup tables"""

import argparse


# --------------------------------------------------
def get_args():
    """get command-line arguments"""

    parser = argparse.ArgumentParser(
      description='Gashlycrumb',
      formatter_class=argparse.ArgumentDefaultsHelpFormatter)

    parser.add_argument('letter',
                        help='Letter(s)',
                        metavar='letter',
                        nargs='+',
                        type=str)

    parser.add_argument('-f',
                        '--file',
                        help='Input file',
                        metavar='FILE',
                        type=argparse.FileType('r'),
                        default='gashlycrumb.txt')

    return parser.parse_args()


# --------------------------------------------------
def main():
    """Make a jazz noise here"""

    args = get_args()

    lookup = {}
    for line in args.file:
      lookup.upper()] = line.rstrip()

    for letter in args.letter:
      if letter.upper() in lookup:
            print(lookup)
      else:
            print(f'I do not know "{letter}".')


# --------------------------------------------------
if __name__ == '__main__':
    main()
</code></pre>

<p>&nbsp;</p>

Jacktang 发表于 2024-6-17 07:33

<p>创建程序、添加注释、怎样写一个测试程序、添加#!释伴行、可执行程序、理解$PATH、添加参数和帮助,书的内容还是很全面的</p>

秦天qintian0303 发表于 2024-6-17 08:53

<p>一步一步循序渐进,楼主应该有一定的python开发经验吧</p>

okhxyyo 发表于 2024-6-17 09:00

<p>谢谢分享~~~好书看了还可以实操一下</p>

chejm 发表于 2024-6-17 09:04

<p>感谢楼主分享的python学习心得,内容非常详实,通俗易懂,希望楼主继续分享后续内容,大家共同学习</p>

打破传统 发表于 2024-6-17 09:42

秦天qintian0303 发表于 2024-6-17 08:53
一步一步循序渐进,楼主应该有一定的python开发经验吧

<p>小白一枚,分享的都是书中的内容,这本书写的很好,章节调理很清晰,认真读非常好看懂!</p>

极限零 发表于 2024-6-17 10:24

<p>感谢分享,要注意一下书中python的版本,在3.11以后有一些功能有了较大的变化</p>
页: [1]
查看完整版本: 趣味微项目,轻松学Python_1-7章读书心得