2021年12月26日 星期日

利用NFT Art Generator產生海綿寶寶的NFT圖像與JSON資料

原始程式:https://github.com/kosmosmo/NFT_Art_Generator

修訂的程式:黃底是有修訂部份,126-130行是把註解拿掉。

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
project_folder = '<您的目錄>/NFT_Art_Generator-master/example/'
total_art = 100

from collections import OrderedDict
import os, json, random,cv2
import numpy as np

def create_json():
    layers_map = OrderedDict()
    my_layers = os.listdir(project_folder+'layers')
    for layer in my_layers:
        layers_map[layer] = {}
        pics = os.listdir(project_folder+'layers'+ '\\' + layer)
        temp = {'0_no_attributes':{'att_chance':1.0,'black_list_att':[]}}
        for p in pics:
            temp[p.split('.')[0]] = {'att_chance':1.0,'black_list_att':[]}
        layers_map[layer]['link_att'] = None
        layers_map[layer]['attributes'] = temp
        with open(project_folder + 'layers_map.json', 'w') as f:
            f.write(json.dumps(layers_map, indent=4, separators=(',', ': '), sort_keys=True))
    return layers_map

def get_weight(attributes):
    population = []
    weight = []
    for key,val in attributes.items():
        population.append(key)
        weight.append(val['att_chance'])
    return [population,weight]

def generate_att():
    with open(project_folder + 'layers_map.json', 'r') as f:
        layers_map = json.load(f, object_pairs_hook=OrderedDict)
    attribute_map = OrderedDict()
    visited = set()
    i = 0
    while i < total_art:
        print ('generating number ' + str(i))
        temp = OrderedDict()
        atts = ''
        for key,val in layers_map.items():
            if val['link_att'] == None:
                population, weights = get_weight(val['attributes'])
                random_pick = random.choices(population=population, weights=weights)[0]
                temp[key] = random_pick
            else:
                if temp[val['link_att']] in val['attributes']:
                    temp[key] = temp[val['link_att']]
                else:
                    temp[key] ='0_no_attributes'
            atts += key + ':' +  temp[key]+ ','
        if atts not in visited:
            visited.add(atts)
            attribute_map[i] = temp
            i += 1
    with open(project_folder + 'attributes_map.json', 'w') as f:
        f.write(json.dumps(attribute_map, indent=4, separators=(',', ': '), sort_keys=True))
    return attribute_map

def generate_art(attribute_map=None):
    if not attribute_map:
        with open(project_folder + 'attributes_map.json', 'r') as f:
            attribute_map = json.load(f, object_pairs_hook=OrderedDict)
    for key,val in attribute_map.items():
        print('generating img ' + key)
        img1 =  np.zeros((1, 1,3), dtype=np.uint8)
        for key1,val1 in val.items():
            if val1 == "0_no_attributes":continue
            img_path = project_folder + 'layers\\' +key1 + '\\' +  val1  + ".png"
            fg = cv2.imread(img_path, -1)
            fg = cv2.cvtColor(fg, cv2.COLOR_RGB2RGBA)
            fgMask = fg[:, :, 3:]
            img = fg[:, :, :-1]
            bgMask = 255 - fgMask
            imgMask = cv2.cvtColor(fgMask, cv2.COLOR_GRAY2BGR)
            bgMask = cv2.cvtColor(bgMask, cv2.COLOR_GRAY2BGR)
            bgNew = (img1 * (1 / 255.0)) * (bgMask * (1 / 255.0))
            imgNew = (img * (1 / 255.0)) * (imgMask * (1 / 255.0))
            result = np.uint8(cv2.addWeighted(bgNew, 255.0, imgNew, 255.0, 0.0))
            img1 = result
        """
        # no compression        
        cv2.imwrite(project_folder + 'outputs\\'+ key +'.png', img1)
        """
        cv2.imwrite(project_folder + 'outputs\\'+ key + '.jpg', img1, [int(cv2.IMWRITE_JPEG_QUALITY), 90])


def generate_trait_data():
    with open(project_folder + 'attributes_map.json', 'r') as f:
        attribute_map = json.load(f, object_pairs_hook=OrderedDict)
    trait_data_path = project_folder + 'outputs_data/'
    for key,val in attribute_map.items():
        res = []
        for k,v in val.items():
            if v == "0_no_attributes":continue
            att = {}
            k = '_'.join(k.split('_')[1:])
            att['trait_type'] = k
            att['value'] = v.replace('_', ' ')
            res.append(att)
        with open(trait_data_path + str(key) +'.json', 'w') as f:
            f.write(json.dumps(res, indent=4, separators=(',', ': '), sort_keys=True))


def slicing_dic(order_dic,start,end):
    list_dict = list(order_dic.items())
    slice_dic = list_dict[start:end]
    res = OrderedDict(slice_dic)
    return (res)

'''
from itertools import islice
from multiprocessing import Process
if __name__ == '__main__':
    with open(project_folder + 'attributes_map.json', 'r') as f:
        attribute_map = json.load(f, object_pairs_hook=OrderedDict)
    #attribute_map = slicing_dic(attribute_map,0,2000)  # breaking the map into smaller chunks for render.
    def chunks(data, SIZE=100):
       it = iter(data)
       for i in range(0, len(data), SIZE):
          yield {k:data[k] for k in islice(it, SIZE)}
    for item in chunks(attribute_map):
        proc = Process(target=generate_art, args=(item,))
        proc.start()
'''
create_json()
generate_att()

generate_art()
generate_trait_data()

3.因應第91行,另外還需要建立outputs_data的目錄。
4.若找不到cv2套件,可以執行pip install opencv-python
5.執行
python generator.py
6.查看結果:
圖像:

JSON資料檔:

打開0.json
[
    {
        "trait_type": "feet",
        "value": "feet"
    },
    {
        "trait_type": "cloth",
        "value": "blue pant"
    },
    {
        "trait_type": "shoe",
        "value": "dress"
    },
    {
        "trait_type": "item",
        "value": "choco"
    },
    {
        "trait_type": "hand",
        "value": "hand"
    },
    {
        "trait_type": "sleeve",
        "value": "squidward"
    },
    {
        "trait_type": "face",
        "value": "nah"
    },
    {
        "trait_type": "head",
        "value": "soda hat"
    },
    {
        "trait_type": "glasses",
        "value": "heart glasses"
    }
]

用pixelArt_Generator工具來產生NFT圖案

 原始程式來源:https://github.com/emirongrr/pixelArt_Generator

1. 依照上述來源下載程式。

2.切換目錄

3.安裝套件

  • pip install pillow
  • pip install -r requirements.txt
4.執行程式
  • python main.py
5.查看結果

6.按下上圖中RANDOMIZE,每按一次即產生新的圖片。




7.按下GET ALL鍵,產生所有圖案






2021年12月24日 星期五

用Python來產生NFT松鼠藝術圖案

參考文章:Create Generative NFT Art with Rarities

1.下載程式

程式庫:https://github.com/rounakbanik/generative-art-nft

請點選Code旁的小三角形,再選Download ZIP。

2.解壓縮

3. 安裝套件

pip install Pillow pandas progressbar2

4. 執行程式


5.查看結果



2021年12月19日 星期日

使用Python來建立您自己的NFT圖片集


參考文章:Create Your Own NFT Collection With Python

圖片下載:https://github.com/usetech-llc/substrapunks/archive/refs/heads/master.zip

維基百科:非同質化代幣(NFT)

注意!程式碼176-181和195行,要注意必須要更改成實際的目錄夾。

程式碼:

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
from PIL import Image 
from IPython.display import display 
import random
import json
import os

# Each image is made up a series of traits
# The weightings for each trait drive the rarity and add up to 100%

face = ["White", "Black"] 
face_weights = [60, 40]

ears = ["ears1", "ears2", "ears3", "ears4"] 
ears_weights = [25, 30 , 44, 1]

eyes = ["regular", "small", "rayban", "hipster", "focused"] 
eyes_weights = [70, 10, 5, 1, 14]

hair = ['hair1', 'hair10', 'hair11', 'hair12', 'hair2', 'hair3', 'hair4',
 'hair5',
 'hair6',
 'hair7',
 'hair8',
 'hair9']
hair_weights = [10 , 10 , 10 , 10 ,10, 10, 10 ,10 ,10, 7 , 1 , 2]

mouth = ['m1', 'm2', 'm3', 'm4', 'm5', 'm6']
mouth_weights = [10, 10,50, 10,15, 5]

nose = ['n1', 'n2']
nose_weights = [90, 10]

# Dictionary variable for each trait. 
# Eech trait corresponds to its file name

face_files = {
    "White": "face1",
    "Black": "face2"
}

ears_files = {
    "ears1": "ears1",
    "ears2": "ears2",
    "ears3": "ears3",
    "ears4": "ears4"
}

eyes_files = {
    "regular": "eyes1",
    "small": "eyes2",
    "rayban": "eyes3",
    "hipster": "eyes4",
    "focused": "eyes5"     
}

hair_files = {
    "hair1": "hair1",
    "hair2": "hair2",
    "hair3": "hair3",
    "hair4": "hair4",
    "hair5": "hair5",
    "hair6": "hair6",
    "hair7": "hair7",
    "hair8": "hair8",
    "hair9": "hair9",
    "hair10": "hair10",
    "hair11": "hair11",
    "hair12": "hair12"
}

mouth_files = {
    "m1": "m1",
    "m2": "m2",
    "m3": "m3",
    "m4": "m4",
    "m5": "m5",
    "m6": "m6"
}

nose_files = {
    "n1": "n1",
    "n2": "n2"   
}

## Generate Traits

TOTAL_IMAGES = 100 # Number of random unique images we want to generate

all_images = [] 

# A recursive function to generate unique image combinations
def create_new_image():
    
    new_image = {} #

    # For each trait category, select a random trait based on the weightings 
    new_image ["Face"] = random.choices(face, face_weights)[0]
    new_image ["Ears"] = random.choices(ears, ears_weights)[0]
    new_image ["Eyes"] = random.choices(eyes, eyes_weights)[0]
    new_image ["Hair"] = random.choices(hair, hair_weights)[0]
    new_image ["Mouth"] = random.choices(mouth, mouth_weights)[0]
    new_image ["Nose"] = random.choices(nose, nose_weights)[0]
    
    if new_image in all_images:
        return create_new_image()
    else:
        return new_image
    
    
# Generate the unique combinations based on trait weightings
for i in range(TOTAL_IMAGES): 
    
    new_trait_image = create_new_image()
    
    all_images.append(new_trait_image)

# Returns true if all images are unique
def all_images_unique(all_images):
    seen = list()
    return not any(i in seen or seen.append(i) for i in all_images)

print("Are all images unique?", all_images_unique(all_images))
# Add token Id to each image
i = 0
for item in all_images:
    item["tokenId"] = i
    i = i + 1
   
print(all_images)

# Get Trait Counts

face_count = {}
for item in face:
    face_count[item] = 0
    
ears_count = {}
for item in ears:
    ears_count[item] = 0

eyes_count = {}
for item in eyes:
    eyes_count[item] = 0
    
hair_count = {}
for item in hair:
    hair_count[item] = 0
    
mouth_count = {}
for item in mouth:
    mouth_count[item] = 0
    
nose_count = {}
for item in nose:
    nose_count[item] = 0

for image in all_images:
    face_count[image["Face"]] += 1
    ears_count[image["Ears"]] += 1
    eyes_count[image["Eyes"]] += 1
    hair_count[image["Hair"]] += 1
    mouth_count[image["Mouth"]] += 1
    nose_count[image["Nose"]] += 1
    
print(face_count)
print(ears_count)
print(eyes_count)
print(hair_count)
print(mouth_count)
print(nose_count)


#### Generate Images    
for item in all_images:

    im1 = Image.open(f'<下載解壓縮的目錄夾>/substrapunks-master/scripts/face_parts/face/{face_files[item["Face"]]}.png').convert('RGBA')
    im2 = Image.open(f'<下載解壓縮的目錄夾>/substrapunks-master/scripts/face_parts/eyes/{eyes_files[item["Eyes"]]}.png').convert('RGBA')
im3 = Image.open(f'<下載解壓縮的目錄夾>/substrapunks-master/scripts/face_parts/ears/{ears_files[item["Ears"]]}.png').convert('RGBA')
im4 = Image.open(f'<下載解壓縮的目錄夾>/substrapunks-master/scripts/face_parts/hair/{hair_files[item["Hair"]]}.png').convert('RGBA')
im5 = Image.open(f'<下載解壓縮的目錄夾>/substrapunks-master/scripts/face_parts/mouth/{mouth_files[item["Mouth"]]}.png').convert('RGBA')
im6 = Image.open(f'<下載解壓縮的目錄夾>/substrapunks-master/scripts/face_parts/nose/{nose_files[item["Nose"]]}.png').convert('RGBA')
#Create each composite com1 = Image.alpha_composite(im1, im2) com2 = Image.alpha_composite(com1, im3) com3 = Image.alpha_composite(com2, im4) com4 = Image.alpha_composite(com3, im5) com5 = Image.alpha_composite(com4, im6) #Convert to RGB rgb_im = com5.convert('RGB') file_name = str(item["tokenId"]) + ".png" rgb_im.save("<新建儲存圖片的資料夾>/" + file_name)

程式解說:
  • 第1-5行 匯入會使用到的程式套件。
  • 第6-31行 主要是分配特質稀有度,每個獨特的頭像都包含五個特徵:臉、耳朵、頭髮、嘴、鼻子等,當有些鼻子必須比其他鼻子更稀有,您需要為您擁有的不同類型的鼻子分配權重,分別是90%和10%,但數組的總數應始終為 100。我們有兩種類型的面孔,黑與白,您必須指定白臉圖像有 60% 的機會,黑臉有40% 的機會。
  • 第32-83行,對特徵進行分類作業,如果您想為您的特徵使用不同的名稱,可以使用字典,例如:特徵名稱“face1”被歸類為白臉,而“face2”被歸類為黑臉。
  • 第85-116行為定義圖像特徵,建立每個頭像圖像是由六張圖片的組合:臉、鼻子、嘴巴、耳朵和眼睛。第104-107行有判斷是否重複,若重複則更外產生。
  • 第117-130行是為了驗證唯一性,對於 NFT 頭像項目,重要的是每個頭像都是獨一無二的。因此,您需要檢查所有圖像是否都是唯一的。接下來,為每個圖像添加一個唯一標識符。在第112行會列印出
Are all images unique? True。
  • 第131-172為性狀計數,要確切知道每個特徵出現的次數,您必須要跟踪現在有多少特徵出現在您的圖像集中。但要特別注意根據預定義的權重和隨機函數分配了特徵。這意味著即使您將白人面孔的權重定義為 60,也不可能恰好有 60 個白人面孔,例如這次產生了53個白臉但產生了47個黑臉。執行結果如下:
{'White': 53, 'Black': 47}
{'ears1': 29, 'ears2': 34, 'ears3': 35, 'ears4': 2}
{'regular': 66, 'small': 16, 'rayban': 11, 'hipster': 0, 'focused': 7}
{'hair1': 8, 'hair10': 8, 'hair11': 13, 'hair12': 12, 'hair2': 13, 'hair3': 12, 'hair4': 6, 'hair5': 11, 'hair6': 11, 'hair7': 4, 'hair8': 1, 'hair9': 1}
{'m1': 6, 'm2': 7, 'm3': 56, 'm4': 12, 'm5': 13, 'm6': 6}
{'n1': 92, 'n2': 8}

  • 第173-195行是為了生成圖像,執行結果在本文文章一開頭。

2021年12月18日 星期六

用Python來查詢可可的農作物統一名稱與代碼

參考資料:農作物統一名稱與代碼

資料介接:https://data.coa.gov.tw/Service/OpenData/TransService.aspx?UnitId=LC7YWlenhLuP

程式碼:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
import requests
import json
r = requests.get('https://data.coa.gov.tw/Service/OpenData/TransService.aspx?UnitId=LC7YWlenhLuP')
text = json.loads(r.text)
for row in text:
    if '可可' in row['CNAME']:
        print ('農作物統一代碼:'+row['CROP_UID'])
        print ('農作物中文名稱:'+row['CNAME'])
        print ('農作物中文別名:'+row['ALIAS_CNAME'])
        print ('農作物大分類代碼:'+row['PLV1'])
        print ('農作物大分類中文名稱:'+row['PLV1_NAME'])
        print ('農作物中分類代碼:'+row['PLV2'])
        print ('農作物中分類中文名稱:'+row['PLV2_NAME'])
        print ('農作物小分類代碼:'+row['PLV3'])
        print ('農作物小分類中文名稱:'+row['PLV3_NAME'])
        print ('農作物品種/品項/品系代碼:'+row['PLV4'])
        print ('農作物品種/品項/品系中文名稱:'+row['PLV4_NAME'])
        print ('植物分類科別代碼:'+row['PLV5'])
        print ('植物分類科別中文名稱:'+row['PLV5_NAME'])
        print ('產業應用代碼:'+row['PLV6'])
        print ('\n')

執行結果:
農作物統一代碼:00703000038000000
農作物中文名稱:可可製品
農作物中文別名:
農作物大分類代碼:007
農作物大分類中文名稱:農產品加工類
農作物中分類代碼:03
農作物中分類中文名稱:水果加工類
農作物小分類代碼:038
農作物小分類中文名稱:可可製品
農作物品種/品項/品系代碼:0000
農作物品種/品項/品系中文名稱:
植物分類科別代碼:000
植物分類科別中文名稱:
產業應用代碼:00


農作物統一代碼:00703000036000000
農作物中文名稱:可可椰子製品
農作物中文別名:
農作物大分類代碼:007
農作物大分類中文名稱:農產品加工類
農作物中分類代碼:03
農作物中分類中文名稱:水果加工類
農作物小分類代碼:036
農作物小分類中文名稱:椰子製品
農作物品種/品項/品系代碼:0000
農作物品種/品項/品系中文名稱:
植物分類科別代碼:000
植物分類科別中文名稱:
產業應用代碼:00


農作物統一代碼:00305094012000000
農作物中文名稱:可可
農作物中文別名:
農作物大分類代碼:003
農作物大分類中文名稱:果樹類
農作物中分類代碼:05
農作物中分類中文名稱:堅果類
農作物小分類代碼:012
農作物小分類中文名稱:可可
農作物品種/品項/品系代碼:0000
農作物品種/品項/品系中文名稱:
植物分類科別代碼:094
植物分類科別中文名稱:梧桐科
產業應用代碼:00

範例二:濾掉椰子製品

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
import requests
import json
r = requests.get('https://data.coa.gov.tw/Service/OpenData/TransService.aspx?UnitId=LC7YWlenhLuP')
text = json.loads(r.text)
for row in text:
    if '可可' in row['CNAME']:
        if '椰子' in row['CNAME']: continue
        print ('農作物統一代碼:'+row['CROP_UID'])
        print ('農作物中文名稱:'+row['CNAME'])
        print ('農作物中文別名:'+row['ALIAS_CNAME'])
        print ('農作物大分類代碼:'+row['PLV1'])
        print ('農作物大分類中文名稱:'+row['PLV1_NAME'])
        print ('農作物中分類代碼:'+row['PLV2'])
        print ('農作物中分類中文名稱:'+row['PLV2_NAME'])
        print ('農作物小分類代碼:'+row['PLV3'])
        print ('農作物小分類中文名稱:'+row['PLV3_NAME'])
        print ('農作物品種/品項/品系代碼:'+row['PLV4'])
        print ('農作物品種/品項/品系中文名稱:'+row['PLV4_NAME'])
        print ('植物分類科別代碼:'+row['PLV5'])
        print ('植物分類科別中文名稱:'+row['PLV5_NAME'])
        print ('產業應用代碼:'+row['PLV6'])
        print ('\n')

執行結果:
農作物統一代碼:00703000038000000
農作物中文名稱:可可製品
農作物中文別名:
農作物大分類代碼:007
農作物大分類中文名稱:農產品加工類
農作物中分類代碼:03
農作物中分類中文名稱:水果加工類
農作物小分類代碼:038
農作物小分類中文名稱:可可製品
農作物品種/品項/品系代碼:0000
農作物品種/品項/品系中文名稱:
植物分類科別代碼:000
植物分類科別中文名稱:
產業應用代碼:00


農作物統一代碼:00305094012000000
農作物中文名稱:可可
農作物中文別名:
農作物大分類代碼:003
農作物大分類中文名稱:果樹類
農作物中分類代碼:05
農作物中分類中文名稱:堅果類
農作物小分類代碼:012
農作物小分類中文名稱:可可
農作物品種/品項/品系代碼:0000
農作物品種/品項/品系中文名稱:
植物分類科別代碼:094
植物分類科別中文名稱:梧桐科
產業應用代碼:00

2021年12月12日 星期日

認識可可豆以及Python print()函式的參數使用

 參考:可可豆

範例一:單一參數

1
2
3
CocoaBean=[4,6,2,10,12]

print('果實成熟期為%d到6個月,每年成熟兩次,主要收穫期為10月到12月。' % CocoaBean[0])

執行結果:
果實成熟期為4到6個月,每年成熟兩次,主要收穫期為10月到12月。

範例二:雙參數

1
2
3
4
CocoaBean=[4,6,2,10,12]

print('果實成熟期為%d%d個月,每年成熟兩次,主要收穫期為10月到12月。'
      % (CocoaBean[0], CocoaBean[1]))

執行結果:
果實成熟期為4到6個月,每年成熟兩次,主要收穫期為10月到12月。

範例三:多參數

1
2
3
4
5
6
7
8
CocoaBean=[4,6,2,10,12]

print('果實成熟期為%d%d個月,每年成熟%d次,主要收穫期為%d月到%d月。'
      % (CocoaBean[0],
         CocoaBean[1],
         CocoaBean[2],
         CocoaBean[3],
         CocoaBean[4]))

執行結果:
果實成熟期為4到6個月,每年成熟2次,主要收穫期為10月到12月。

範例四:
1
2
3
4
5
6
7
8
CocoaBean=[4,6,2,10,12]

print('果實成熟期為{}到{}個月,每年成熟{}次,主要收穫期為{}月到{}月。'.format(
      CocoaBean[0],
      CocoaBean[1],
      CocoaBean[2],
      CocoaBean[3],
      CocoaBean[4]))

執行結果:
果實成熟期為4到6個月,每年成熟2次,主要收穫期為10月到12月。


用字典來表示可可豆的品種

 參考資料:可可豆

字典是一種容器,以鍵:值(KEY:VALUE)成對出現。

範例一:列印所有元素

1
2
3
4
5
CocoaBean={'Criollo':'產量佔可可豆總產量3%,是最頂級的可可豆品種。',
           'Forastero':'市面上最常見,生產量最大,佔80%以上。',
           'Trintario':'由Criollo、Forastero所混種的Trintario'}

print(CocoaBean)

執行結果:
{'Criollo': '產量佔可可豆總產量3%,是最頂級的可可豆品種。', 'Forastero': '市面上最常見,生產量最大,佔80%以上。', 'Trintario': '由Criollo、Forastero所混種的Trintario'}

範例二:取行單一元素

1
2
3
4
5
CocoaBean={'Criollo':'產量佔可可豆總產量3%,是最頂級的可可豆品種。',
           'Forastero':'市面上最常見,生產量最大,佔80%以上。',
           'Trintario':'由Criollo、Forastero所混種的Trintario'}

print(CocoaBean['Criollo'])

執行結果:
產量佔可可豆總產量3%,是最頂級的可可豆品種。

範例三:列印所有的KEY
1
2
3
4
5
6
CocoaBean={'Criollo':'產量佔可可豆總產量3%,是最頂級的可可豆品種。',
           'Forastero':'市面上最常見,生產量最大,佔80%以上。',
           'Trintario':'由Criollo、Forastero所混種的Trintario'}

for bean in CocoaBean:
    print(bean)

執行結果:
Criollo
Forastero
Trintario

範例四:走訪所有的值
1
2
3
4
5
6
CocoaBean={'Criollo':'產量佔可可豆總產量3%,是最頂級的可可豆品種。',
           'Forastero':'市面上最常見,生產量最大,佔80%以上。',
           'Trintario':'由Criollo、Forastero所混種的Trintario'}

for bean in CocoaBean.values():
    print(bean)

執行結果:
產量佔可可豆總產量3%,是最頂級的可可豆品種。
市面上最常見,生產量最大,佔80%以上。
由Criollo、Forastero所混種的Trintario

範例五:走訪所有鍵,取行所有的內容
1
2
3
4
5
6
CocoaBean={'Criollo':'產量佔可可豆總產量3%,是最頂級的可可豆品種。',
           'Forastero':'市面上最常見,生產量最大,佔80%以上。',
           'Trintario':'由Criollo、Forastero所混種的Trintario'}

for bean in CocoaBean.keys():
    print(bean,'是',CocoaBean[bean])

執行結果:
Criollo 是 產量佔可可豆總產量3%,是最頂級的可可豆品種。
Forastero 是 市面上最常見,生產量最大,佔80%以上。
Trintario 是 由Criollo、Forastero所混種的Trintario

範例六:取出所有的鍵/值
1
2
3
4
5
6
CocoaBean={'Criollo':'產量佔可可豆總產量3%,是最頂級的可可豆品種。',
           'Forastero':'市面上最常見,生產量最大,佔80%以上。',
           'Trintario':'由Criollo、Forastero所混種的Trintario'}

for key, value in CocoaBean.items():
    print(key, '是', value)

執行結果:
Criollo 是 產量佔可可豆總產量3%,是最頂級的可可豆品種。
Forastero 是 市面上最常見,生產量最大,佔80%以上。
Trintario 是 由Criollo、Forastero所混種的Trintario

可可豆的品種可以用不可更改的元組來表示

 參考資料:可可豆

可可豆的品種可以用不可更改的元組來表示,元組是使用小括號來表示,內容不可以修改。

範例一:印出所有資料

1
2
3
4
5
CocoaBean=(('Criollo','產量佔可可豆總產量3%,是最頂級的可可豆品種。'),
           ('Forastero','市面上最常見,生產量最大,佔80%以上。'),
           ('Trintario','由Criollo、Forastero所混種的Trintario'))

print(CocoaBean)

執行結果:
(('Criollo', '產量佔可可豆總產量3%,是最頂級的可可豆品種。'), ('Forastero', '市面上最常見,生產量最大,佔80%以上。'), ('Trintario', '由Criollo、Forastero所混種的Trintario'))

範例二:印出單一筆的資料

1
2
3
4
5
CocoaBean=(('Criollo','產量佔可可豆總產量3%,是最頂級的可可豆品種。'),
           ('Forastero','市面上最常見,生產量最大,佔80%以上。'),
           ('Trintario','由Criollo、Forastero所混種的Trintario'))

print(CocoaBean[1])

執行結果:
('Forastero', '市面上最常見,生產量最大,佔80%以上。')

範例三:印出單一筆資料中第一個元素
1
2
3
4
5
CocoaBean=(('Criollo','產量佔可可豆總產量3%,是最頂級的可可豆品種。'),
           ('Forastero','市面上最常見,生產量最大,佔80%以上。'),
           ('Trintario','由Criollo、Forastero所混種的Trintario'))

print(CocoaBean[1][0])

執行結果:
Forastero

2021年12月11日 星期六

用可可豆又稱可可亞豆來學習Python print()函式的用法

南投名間目前是全台種植可可產量最多的鄉鎮,有興趣可以參考可可生產的前十名鄉鎮有那些?Python一下!的文章。

參考資料:可可豆

本篇文章將用print來介紹可可,並以可可的內容來學習如何使用print()函式。

1
2
text = '可可亞豆'
print('可可豆又稱%s' % text)

執行結果:
可可豆又稱可可亞豆

新式字串格式化(format())的用法
1
2
text = '可可亞豆'
print('可可豆又稱{}'.format(text))

執行結果:
可可豆又稱可可亞豆

使用名稱來指定變數就可以變換順序
1
2
3
name = '可可豆'
text = '可可亞豆'
print('{name} 又稱 {text}'.format(name=name, text=text))

執行結果:
可可豆 又稱 可可亞豆


以Python為主的智慧農業教材

 基礎篇

  1. 用可可豆來學習Python print()函式的用法
  2. Python一下百香果故鄉在南投埔里
  3. 認識可可豆以及Python print()函式的參數使用
  4. 百香果含有超過130種以上的芳香物質,130是整數還是字串?
  5. 從百香果分級來看Python的List串列資料結構
  6. 用Python多層容器來儲存百香果大小規格,並用切片來存取
  7. 百香果分級標準居然可以用不可更改的元組來表示
  8. 可可豆的品種可以用不可更改的元組來表示
  9. 一堆不可以重複以及改變值的資料的集合可用來百香果分級判斷
  10. 超好用的字典,用鍵查值的觀念來查百香果的分級標準
  11. 用百香果資料串列來學習Python的迴圈
  12. 用百香果資料串列來學習Python的分支
  13. 用字典來表示不同地區的百香果別名
  14. 用字典來表示可可豆的品種

應用篇
  1. 用Python找出埔里地區的文化資產
  2. 用Python來撰寫顯示今天百香果市場交易情形的程式
  3. 用Python來顯示今天各市場百香果交易的統計圖
  4. 使用Python和Django設計百香果農產品交易行情網站
  5. 用Python撰寫「用戶定義的HTTP回呼」結合IFTTT服務在LINE群組報導百香果交易情形
  6. 使用Python/pyecharts四行程式搞定百香果近8年的交易行情圖
  7. 用Python來查詢可可的農作物統一名稱與代碼
  8. 用Python實作水果分類器
  9. Python實作各種水果分類器那一種最好?
  10. 利用最近鄰居法(KNN)搭配matplotlib畫出水果分類圖
  11. 百香果交易行情網站設計(一) - 取得百香果市場交易
  12. 百香果交易行情網站設計(二) - 四個步驟搞定Mezzanine
  13. 百香果交易行情網站設計(三) - 更換主題醜小鴨變天鵝
  14. 百香果交易行情網站設計(四) - 讓Mezzanine承接自己的意圖
  15. 初體驗! 使用pyecharts以水果交易行情為例
  16. 使用Flask模板瑄染,製作水果交易網站
  17. 製作水果交易網站(一) -在Django中用pyecharts製作圖表
  18. 製作水果交易網站(二) - 前後台分離
  19. 製作水果交易網站(三) - 定時全量更新數據
  20. 製作水果交易網站(四) - 定時增量更新圖表
  21. 利用Python透過氣象開放資料平台取得百香果故鄉的氣象資料
  22. 利用MicroPython透過OpenWeather取得百香果故鄉的氣象資料
  23. 十個步驟輕輕鬆鬆利用Mezzanine打造百香果交易行情網站
  24. 三個Python指令用來初探農情報告資訊網來看百香果的故鄉在南投
  25. 四個Python指令以POST命令爬出台灣各縣市百香果作物農情
  26. 不到20行Python程式就能從農情報告資訊網中算出南投百香果產值佔合國87.7%
  27. 用Pandas套件來處理農情報告資訊網特別好用
  28. 用十行Python指令,就可以得南投各鄉鎮百香果的生產情形
  29. 百香果生產的前十名鄉鎮有那些?Python一下!
  30. 茶生產的前十名鄉鎮有那些?Python一下!
  31. 咖啡生產的前十名鄉鎮有那些?Python一下!
  32. 薑生產的前十名鄉鎮有那些?Python一下!
  33. 食用蕃茄生產的前十名鄉鎮有那些?Python一下!
  34. 茭白筍生產的前十名鄉鎮有那些?Python一下!
  35. 節瓜生產的前十名鄉鎮有那些?Python一下!
  36. 香蕉生產的前十名鄉鎮有那些?Python一下!
  37. 可可生產的前十名鄉鎮有那些?Python一下!
  38. 梅生產的前十名鄉鎮有那些?Python一下!
  39. 用Python爬農情報告可以得知南投近十年來在百香果的耕種面積成長快一倍
  40. 用Python爬農情報告瞭解南投近十年的百香果一級農業的狀況
  41. 用Python爬出南投百香果生產成本以及報酬
  42. 畫出南投縣毛猪成交頭數-總數的曲線圖
  43. 物聯網MQTT自動泡泡機
  44. 好用的物聯網APP工具-IoT MQTT Panel
  45. 使用ESP32/8266晶片的MicroPython範例
  46. 用MicroPython設計遠距情境燈以機智雲為例
  47. Open API應用:取得南投縣名間鄉的美食資訊
  48. Open API應用: 取得南投縣名間鄉的景點資料
  49. Open API應用:南投以豬肉聞名的小吃店
  50. Open API應用:找出南投有"豬"元素的景點
  51. 當Python遇見猪樂園,來看南投縣毛猪成交頭數-總數
  52. Open API應用:食物資訊樣貌API使用
  53. Open API應用:找出所有豬食物資訊樣貌
  54. 用Python找出猪樂園附近的農村地方美食小吃特色料理
  55. 用Python讀取百香果交易情形再利用Line bot來通報