見出し画像

ChatGPT時代のプログラミング講座 ―第1章:プログラムの基本構造―


1. はじめに

プログラムとはコンピュータに特定の計算を行わせるための、命令文のことです。プログラムは一定のルールに従った文章で記述されます。この文章の書き方にはプログラミング言語ごとにルールの違いがありますが、基本的な要素は共通しています。

1.1 今回例とするプログラム

今回はウェブページにリンクが貼られているpdfファイルを自動でダウンロードするPythonコードを例にします。

プログラムを全く知らない人にとっては暗号文のように見えると思いますが、本記事を読み終える頃には、内容が理解できるようになっているはずです。

import requests
from bs4 import BeautifulSoup
import os
import time  # timeモジュールをインポート

def download_pdfs(url, download_folder):
    # ウェブページの内容を取得
    response = requests.get(url)
    soup = BeautifulSoup(response.text, 'html.parser')

    # <a>タグを見つけてリンクがPDFファイルを指しているかチェック
    for link in soup.find_all('a'):
        href = link.get('href')
        if href and href.endswith('.pdf'):
            # 完全なPDF URLを構築
            pdf_url = href if href.startswith('http') else url + href
            pdf_filename = pdf_url.split('/')[-1]

            # PDFファイルをダウンロードフォルダに保存
            pdf_response = requests.get(pdf_url)
            pdf_path = os.path.join(download_folder, pdf_filename)
            with open(pdf_path, 'wb') as pdf_file:
                pdf_file.write(pdf_response.content)
            print(f"Downloaded: {pdf_filename}")

            # ダウンロードとダウンロードの間に500msの遅延
            time.sleep(0.5)

# 使用例
url = 'xxxxxxx'  # スクリプトを試すURL
download_folder = './pdf_downloads'  # PDFファイルを保存するフォルダ

download_pdfs(url, download_folder)


1.2 知識の取捨選択

導入記事でもご紹介した通り、GPTを使用してプログラミングする場合、プログラミング言語の具体的な機能について最初に理解する必要はありません。したがって、この章ではプログラムの構造と要素に焦点を当て、それを理解することを目指します。

知っておいた方がいい知識
・プログラムの構造
・プログラムの要素(コメント、変数など)
・プログラムの実行方法、修正方法

現段階で知らなくてもいい知識
・具体的な処理の書き方
    例:response = requests.get(url)とか
     → こういった処理の詳細の意味の理解は現時点で不要です

2. プログラムの構造を知る

基本的にプログラム言語では下記のルールに従って処理が行われます。

  1. 上から順番に処理されていく

  2. コメント行(Python場合 # から始まる行)は無視する 

  3. 定義部は、処理の内容を覚えて、後で呼び出された際に処理する

このルールに従って例題を読み解いてみましょう。

2.1 宣言部

ここではプログラムで使用する機能を取り込んでいます。例えば、今回のプログラムは以下の機能から構成されています。

(1) インターネットへのアクセス
(2) 指定したウェブページの内容を解析
(3) ページ内に埋め込まれたファイルを探索
(4) ファイルのダウンロード(複数ある場合は繰り返し)
(5) ファイルの保存

これらの機能をゼロから自力で実装しようとすると、膨大な時間と知識が必要です。そのため、一般的に使用される機能や便利なツールは、プログラム言語の組み込み機能として提供されたり、開発者によってウェブ上で共有されたりしています。

このような予め用意された機能を取り込むことは、プログラム開発において不可欠な手法と言えます。

2.2 定義部

ここでは、繰り返し使用される処理を定義している部分です。例えば、今回のプログラムでは特定のURLにアクセスし、そのウェブページを解析してファイルをダウンロードする機能が含まれています。この機能は、異なるウェブページで同様の操作を再度実行する可能性が考えられます。

このように、何度も使いまわす可能性が高い処理は、事前にその処理を定義し、必要な時に呼び出して再利用することが一般的です。

2.3 メイン部

最後にメインの処理(URLを指定して、②の機能でファイルをダウンロード)を記載しています。

3. プログラムの要素を知る

3.1 プログラムの要素を見分ける方法

プログラムの要素を理解するのに、インデント(段落の位置)を注目することが大切です。

例えば、②のコード周辺部分をインデントで強調してみましょう。インデントがある箇所は、全て同じグループに属すると考えると、プログラムの構造が把握しやすくなります。

ChatGPTを使用したプログラム開発では、ChatGPTが一部のコードを提供し、それをプログラムに組み込む必要が生じることがあります。
この際、プログラムの要素がどこから始まり、どこで終わるのかを正確に把握することが重要です。

3.2 コメント行

コメントは、処理の内容などを忘れないようにメモしておく際などに活用され、これによりプログラムの可読性が高められます。
実際にコンピュータが処理を行う際は無視されるコードになります。

# コメントの例

プログラム言語によって、コメントの書き方は異なりますが、Pythonでは#から始まる行はコメントとして認識されます。もし開発中にコメントの書き方が分からなければChatGPTに聞いてみましょう。

3.3 変数

変数はプログラムの中でデータを一時的に保存しておくための入れ物です。
一度変数を作れば、いつでもその中身を呼び出したり、中身を書き換えたりすることができます。

例えば、今回のソースコードの場合、下記のような変数が登場しています。

変数が使われ、呼び出されている例。=は変数にデータを入れる問行為を意味します。

3.4 関数

関数はプログラムの中で繰り返し使用される処理など汎用性が高いものをまとめて、いつでも使えるようにする機能です。

変数と同じで、一度作ればいつでもその処理を実行することができ、また、他の人が作った関数を取り込むことができます。

今回の例題では、実は
①の宣言部では、「他の人が作った関数を取り込む」
②の定義部では、「オリジナルの関数を作成する」
③のメイン部では、「②で定義した関数を実行する」

ということを行っています。
それでは実際のコードに照らし合わせて見ていきましょう。

<他の人が作った関数を取り込む>
ここではrequest機能を取り込み、その中のget関数を使用して、その結果を変数responseに格納するという処理を行っている例です。

こんな感じで関数が使用されるんだという感覚がつかめればOKです!

<オリジナルの関数を作成する>

ここでは、あるURLにあるpdfファイルを指定したフォルダにダウンロードする機能を、独自の関数として新しく定義しています。defというのはdefine意味で、関数を定義する際に前につけます。

なお、関数については全て理解できなくても大丈夫です。
関数とはこういう感じのものというイメージがつかめればChatGPTを使ってプログラミングする上では十分です。

4. 例題

Q1:下記のコードを2で示した構造ごとに分けてください

import requests
from bs4 import BeautifulSoup
import csv

# ウェブページからSNSアカウントのリンクを抽出してリストに格納
def extract_social_links(url):
    response = requests.get(url)
    soup = BeautifulSoup(response.text, 'html.parser')
    social_links = []

    for link in soup.find_all('a'):
        href = link.get('href')
        if href and ('facebook.com' in href or 'twitter.com' in href or 'instagram.com' in href):
            social_links.append(href)
    
    return social_links

# 抽出したSNSアカウントのリンクをCSVファイルに保存
def save_to_csv(links, filename):
    with open(filename, 'w', newline='') as file:
        writer = csv.writer(file)
        writer.writerow(["SNS Link"])
        for link in links:
            writer.writerow([link])


web_url = 'xxxxxxx'  # ウェブページのURL
csv_filename = 'social_links.csv'  # CSVファイル名

# ウェブページからSNSアカウントのリンクを抽出
sns_links = extract_social_links(web_url)

# 抽出したリンクをCSVファイルに保存
save_to_csv(sns_links, csv_filename)

Q2:Q1のコードのメイン部で変数にあたるものを全て抜き出してください

Q3:Q1のコードで独自に定義している関数をすべて抜き出してください


5. 解答

A1

宣言部

import requests
from bs4 import BeautifulSoup
import csv

定義部:今回の例題では2つの関数が定義されているため下記が正解です


def extract_social_links(url):
    response = requests.get(url)
    soup = BeautifulSoup(response.text, 'html.parser')
    social_links = []

    for link in soup.find_all('a'):
        href = link.get('href')
        if href and ('facebook.com' in href or 'twitter.com' in href or 'instagram.com' in href):
            social_links.append(href)
    
    return social_links


def save_to_csv(links, filename):
    with open(filename, 'w', newline='') as file:
        writer = csv.writer(file)
        writer.writerow(["SNS Link"])
        for link in links:
            writer.writerow([link])

メイン部

web_url = 'https://example.com'
csv_filename = 'social_links.csv'

sns_links = extract_social_links(web_url)

save_to_csv(sns_links, csv_filename)

A2

web_url
csv_filename
sns_links

A3

extract_social_links(url)
save_to_csv(links, filename)


6. 本格的に学びたい方

プログラミングを仕事にしたい、エンジニアとして働きたいという方にはオンライン講座のUdemyがおすすめです。動画教材で本よりも効率的に学習できるので独学に不安な方は是非ご検討ください! #PR


この記事が気に入ったらサポートをしてみませんか?