ویدیوکست: کار با JSON در پایتون + ویدیو

داشتن درک خوبی از JSON و شیوه کار کردن با اون می‌تونه برای تبدیل شدن به یک توسعه‌دهنده مؤثر خیلی کمک بکنه. JSON یک فرمت متنی برای نمایش داده هستش. JSON مخفف کلمات JavaScript Object Notation به معنای نشانه‌گذاری شیء جاوااسکریپت هستش که همون انگلیسی‌ش بهتره!

JSON به ما این کمک رو می‌کنه تا بتونیم یکسری داده و اطلاعات رو بین دو تا اپلیکیشن منتقل کنیم. این کار از طریق APIها می‌تونه صورت بگیره.

بعد از خوندن این مطلب پیشنهاد می‌کنم که ویدیو مطلب رو هم مشاهده بکنید، چرا که فارغ از آموزش موضوعات مقدماتی، یک مثال عملی از کار با JSON و API رو هم در خودش داره.

معرفی JSON

اما بیایید یک فایل یا رشته متنی که به سبک JSON نوشته شده رو ببینیم:

{
  "firstName": "John",
  "lastName": "Smith",
  "isAlive": true,
  "age": 27,
  "address": {
    "streetAddress": "21 2nd Street",
    "city": "New York",
    "state": "NY",
    "postalCode": "10021-3100"
  },
  "phoneNumbers": [
    {
      "type": "home",
      "number": "212 555-1234"
    },
    {
      "type": "office",
      "number": "646 555-4567"
    },
    {
      "type": "mobile",
      "number": "123 456-7890"
    }
  ],
  "children": [],
  "spouse": null
}

اگر با جاوااسکریپت کار کرده باشید مطمئنا با ساختار داده‌ای Object آشنایی دارید. JSON یک Object مادر همراه با انواع ساختارهای داده‌ای به صورت فرزند در خود دارد. تمام این فرزندها نیز به صورت Key:Value نوشته می‌شوند. برای مثال:

{
   "Name" : "Arastoo",
}

ما توی کدهای بالا یک Key یا کلید با نام Name داریم و همچنین Value یا مقدار Arastoo. موضوع مهم اینه که شما همیشه باید Key یا کلید رو به صورت رشته بنویسید یعنی بین دو تا دابل کوتیشن قرارشون بدید. اما Value یا مقدار براساس نوع داده‌ای که می‌خواید. شما می‌تونید عدد ثابت، مقدار bool، مقدار null، آرایه و یا حتی یک Object دیگر رو اینجا بگذارید.

کار با داده جی‌سان در پایتون

برای اینکه بتونیم با داده‌های جی‌سان کار بکنیم، توی پایتون یه کتابخونه داخلی به اسم json وجود داره که به ما قابلیت خوندن و استفاده از داده‌های جی‌سان رو میده.

اولین کار اینه که اون رو import بکنیم:

import json

حالا اگه یک dir از json داشته باشیم خروجی زیر رو می‌بینیم:

>>> dir(json)
['JSONDecodeError', 'JSONDecoder', 'JSONEncoder', '__all__', '__author__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__path__', '__spec__', '__version__', '_default_decoder', '_default_encoder', 'codecs', 'decoder', 'detect_encoding', 'dump', 'dumps', 'encoder', 'load', 'loads', 'scanner']

این جا میشه تموم متدهای مربوط به این کتابخونه رو مشاهده کرد. چهار مورد مهمش که ما باهاشون کار خواهیم کرد عبارت هستند از load، loads، dump و dumps.

آشنایی با loads

زمانی که قصد تبدیل کردن یک رشته جی‌سان به یک فرمت که پایتون بتونه اون رو متوجه بشه داشته باشیم از loads استفاده می‌کنیم. برای مثال در قسمت پایین شما یک رشته رو می‌بینید که به سبک جی‌سان نوشته شده:

json_str = """
{
    "Name":"Arastoo",
    "Family":"Abasi",
    "Age":19,
    "is_developer":true,
    "Pet":null
}
"""

حالا چطوری از این دیتاها استفاده کنیم؟ مشکل اصلی اینجاست که پایتون اینو صرفا به صورت یک رشته می‌شناسه ولاغیر. اما قصد ما این هستش که داده‌های موجود رو استخراج یا load کنیم. برای اینکار json.loads رو فراخوانی می‌کنیم:

>>> json.loads(json_str)
{'Name': 'Arastoo', 'Family': 'Abasi', 'Age': 19, 'is_developer': True, 'Pet': None}

خروجی در نهایت به سبک یک دیکشنری پایتونی خواهد بود. حالا می‌تونیم به داده‌ها به صورت مستقل دسترسی داشته باشیم.

آشنایی با load

load هم دقیقا همون کار loads رو انجام میده با این تفاوت که بجای خوندن جی‌سان از یک رشته اون رو از یک فایل می‌خونه. برای اینکار باید یک فایل رو باز کرده و بعد از اون اطلاعات فایل رو load بکنیم. من یک فایل user.json با اطلاعات زیر دارم:

{
  "Name": "Arastoo",
  "Family": "Abasi",
  "Age": 19,
  "is_developer": true,
  "Pet": null
}

حالا قصد دارم که این اطلاعات جی‌سان رو توی پایتون استخراج بکنم. برای اینکار از دستور open with برای باز کردن فایل به صورت read استفاده می‌کنم:

with open('user.json', 'r') as json_file:
    json.load(json_file)

این کار دقیقا همون خروجی قبلی رو با یه روش دیگه بهمون میده.

آشنایی با dumps

متد dumps دقیقا نقطه مخالف با loads هستش. شما قبلا یک رشته جی‌سان داشتید که اون رو به دیکشنری پایتون تبدیل می‌کردید، حالا یک دیکشنری پایتون دارید و باید به یک رشته جی‌سان تبدیل ش بکنید. من یک دیکشنری در زیر دارم و قصد دارم که اون رو به جی‌سان تبدیل بکنم:

dict1 = {
    "Name":"Arastoo",
    "Family":"Abasi",
    "Age":19,
    "is_developer":True,
    "Pet":None
}

برای تبدیل کردنش کافیه dumps رو فراخونی کنم:

>>> json.dumps(dict1)
'{"Name": "Arastoo", "Family": "Abasi", "Age": 19, "is_developer": true, "Pet": null}'

آشنایی با dump

حالا قصد داریم تا همون داده‌ها رو که تبدیل کردیم به جی‌سان، در یک فایل قرار بدیم. برای اینکار باید یک فایل رو با with open به صورت w باز کرده و این اطلاعات رو درش قرار بدیم:

with open('user.json','w') as json_file:
    json.dump(dict1, json_file, indent=3)

ورودی اول dump برابر دیکشنری مورد نظر، ورودی دوم فایلی که می‌خواید جی‌سان درش قرار بگیره و ورودی سوم که یک ورودی اختیاریه برای ایجاد تورفتگی به میزان ۳ اسپیس استفاده میشه.

خیلی ساده و لذت بخش. اگر می‌خواید اطلاعات کامل‌تری راجع به این مطلب پیدا کنید و یک مثال عملی رو با این موضوع حل بکنید، ویدیوی مربوط به این ویدیو رو ببینید.

قصد داریم یک برنامه‌ای بنویسیم که براساس IP کاربر بفهمه که اهل کجاست، برای اینکار از API و JSON استفاده می‌کنیم.

پادکست: معرفی و گفتگوهای روزمره

من تو طول روز دو سه ساعت با خودم حرف می‌زنم، سر کار، وقت پیاده‌روی، موقع غذا خوردن و و… . البته دیوونه نیستم که ایکاش بودم، مشکل اینه که کسی نیست باهاش حرف بزنم، که البته ملالی نیست!
اما چه خوب میشه اگه این حرف‌های ذهنی رو ضبط کنم و بزارم هر کی که خواست گوش کنه، شاید یکی خوشش اومد. البته ما خیلی تجهیزات درست و حسابی برای ضبط صدا نداریم ولی خب همین هایی هم که هست خوبه و به نظرم یه آبی ازشون گرم میشه.

بعد مدت‌ها بهونه آوردن از نداشتن ابزار و محتوا و … بالاخره یه قسمت ضبط کردم. توی کست باکس هم منتشر کردم تا کمی جلوه حرفه‌ای تری بهش بدم. قسمت اول پادکست از روزمرگی‌ خودم گفتم و دلیل ساخت یک پادکست رو برای وبلاگم توضیح دادم، جدای از اون‌ها چند تا موسیقی خوب پلی کردیم و همین.

این شما و این پادکست:

کست‌باکس

ویدیوکست: کاربرد _ در پایتون + ویدیو

شاید خیلی از توسعه‌دهنده‌های پایتون خبری از وجود _ به عنوان یک ابزار مهم نداشته باشند. در واقع خودم یکی از اون‌ها بودم. خب باید بگم که این علامت ( _ ) که به انگلیسی میشه Undrescore در جاهای مختلفی از برنامه کاربرد داره. بیایید به کاربردهاش یه نگاهی بندازیم.

کاربرد اول: استفاده در مفسر پایتون

آخرین دستوری که منجر به یه خروجی شده چیه؟ حالا اون خروجی دقیقا چیه؟ اگه می‌خواید به اون مقدار دسترسی داشته باشید کافیه که توی خود مفسر تعاملی پایتون عملگر _ رو وارد بکنید. مثلا:

>>> a = 20
>>> a
20
>>> _
20
>>> _ - 10
10

کاربرد دوم: نادیده گرفتن مقادیر

زمانی که بخواید یه مقداری یا مقادیری رو در برای انتساب‌های جمعی نادیده بگیرید می‌تونید از ـ استفاده کنید. برای روشن شدن قضیه به کد زیر نگاه کنید:

a, _, b = (1, 2, 3) # a = 1, b = 3
print(a, b)

مقدار ۲ در هیچ متغیری ذخیره نمیشه. اگر هم از یک علامت ستاره قبل از آندرسکور استفاده کنید یک بازه از مقادیر رو بیخیال میشه:

a, *_, b = (7, 6, 5, 4, 3, 2, 1)
print(a, b)

کاربرد سوم: استفاده در حلقه‌ها

می‌تونید بجای استفاده از متغیر در یک حلقه for از یک آندرسکور استفاده کنید:

for _ in 'Arastoo':
    print( _ )

کاربرد چهارم: جدا کردن ارقام

وقتی می‌خواید یه مقدار عددی بزرگ رو در یک متغیر قرار بدید، اگه نمی‌تونید که درست از تعداد ارقام متوجه بشید می‌تونید با _ اون‌ها رو از هم جدا بکنید. البته این تنها یک موضوع ظاهریه و چیزی رو توی متغیر غیر از عدد واقعی ذخیره نمیکنه:

million = 1_000_000
binary = 0b_0010
octa = 0o_64
hexa = 0x_23_ab

کاربرد پنجم: مهمترین مورد: نام گذاری

چهار حالت برای نام‌گذاری متغیر با استفاده از _ وجود دارد:

  • استفاده از _ قبل از نام متغیر
  • استفاده از _ بعد از نام متغیر
  • استفاده از دو _ قبل از نام متغیر
  • استفاده از دو _ قبل و بعد از نام متغیر

استفاده از _ قبل از نام متغیر

class Test:

    def __init__(self):
        self.name = "datacamp"
        self._num = 7

obj = Test()
print(obj.name)
print(obj._num)

در قواعد پایتون ذکر شده که برای خصوصیاتی که می‌خواهید Private باشند از یک _ قبل از نام آن‌ها استفاده کنید. البته این موضوع در روند اجرا کاری انجام نمی‌دهد اما اگر بخواهید اصولی کد بنویسید باید این موضوع را در نظر داشته باشید.

البته برای توابع می‌شود از چنین قابلیتی حتی در روند اجرا نیز استفاده کرد. به تکه کد زیر نگاه کنید:

def func():
    return "datacamp"

def _private_func():
    return 7

حالا اگه بخوام که تابع رو توی یه ماژول دیگه import بکنم با تابع func مشکلی نخواهد داشت ولی تابع _private_func رو نمیتونم import بکنم:

>>> from my_functions import *
>>> func()
'datacamp'
>>> _private_func()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name '_private_func' is not defined

البته اگه شیوه import کردن رو تغییر بدم و مستقیم از نام تابع همراه با ماژول استفاده بکنم همچین قابلیتی غیرفعال میشه:

>>> import my_functions
>>> my_functions.func()
'datacamp'
>>> my_functions._private_func()
7

ظاهرا تنها زمانی که بخواید به صورت غیر مستقیما (تکنیکالی اینم اشتباهه) از تابع استفاده کنید به شما خطا میده.

استفاده از _ بعد از نام متغیر

زمانی که مجبور باشید از یک نام برای متغیر استفاده بکنید که همزمان اون نام کلمه کلیدی پایتون هستش می‌تونید یک _ به آخرش اضافه کنید:

>>> def function(class):
  File "<stdin>", line 1
    def function(class):
                 ^
SyntaxError: invalid syntax
>>> def function(class_):
...     pass

استفاده از دو _ قبل از نام متغیر

تصور کنید که شما دو کلاس دارید که هر دو یک خصوصیت با یک اسم دارند. حالا شما یک کلاس سوم هم دارید که از هر دو کلاس قبلی میخواد ارث‌بری بکنه، زمانی که بخواد به هر دو خصوصیت دسترسی داشته باشه به مشکل بر می‌خوره چرا که نمی‌تونه همزمان از دو خصوصیت با یک نام استفاده بکنه. پایتون برای حل این مشکل با تکنیک name mangling از ما پذیرایی میکنه.

مثال:

class Sample():

    def __init__(self):
        self.a = 1
        self._b = 2
        self.__c = 3
obj1 = Sample()

برای دسترسی داشتن به خصوصیات a و b و c چه کاری انجام می‌دهید:

print(obj1.a)
print(obj1._b)
print(obj1.__c)

حالا اگر برنامه رو اجرا بکنید با مشکل روبرو می‌شید. چرا که ما عضوی به اسم __c رو نداریم. بجاش پایتون می‌آد اون عضور رو _Sample__c معرفی میکنه. یعنی ترکیبی از نام کلاس و خود خصوصیت. اینطوری دیگه مشکلی پیش نمیاد.

برای درک بهتر قضیه پیشنهاد میکنم ویدیو اول این مطلب رو ببینید.

استفاده از دو _ قبل و بعد از نام متغیر

توی پایتون به متدهایی که به شکل زیر هستند میگیم متدهای جادویی یا داندر متد. این دستورات ابزارهای پیشفرض پایتونی هستند.

class Sample():

    def __init__(self):
        self.__num__ = 7

obj = Sample()
obj.__num__

بهتره هیچوقت برای اسم گذاری‌هامون از این سبک استفاده نکنیم چرا که ممکنه با دستورات اصلی پایتون اشتباه گرفته بشن.

منبع

https://www.datacamp.com/community/tutorials/role-underscore-python

معرفی سرویس Microverse

اگه یه کسی بیاد بهتون بگه که من توی شیش ماه به صورت رایگان به شما برنامه‌نویسی یاد می‌دم و در نهایت یه کاری رو هم بهتون معرفی می‌کنم که حقوق خوبی داره و به صورت ریموت انجام میشه و من از حقوق‌ت تا زمانی که به درآمد ۱۵ هزار دلار رسیدی ۱۵ درصدش رو برمی‌دارم، شما چی می‌گید؟

چنین سیستمی وجود داره و اسمش هم Microverse هستش. به نظر من که پیشنهاد وسوسه‌کننده‌ایه، شما قراره برای شیش ماه توسط افراد متخصصی به صورت آنلاین آموزش ببینید و در نهایت یک کار ریموت رو انجام بدید. خوبی این موضوع اینه که شما محدودیت جغرافیایی برای کار و برای آموزش رو ندارید. چرا که همه چیز پشت میز کار شما اتفاق می‌افته. از طرفی دیگه از اونجایی که با دلار آمریکا حقوق‌تون رو پرداخت می‌کنن، در نتیجه نگرانی از بابت کم بودن حقوق رو هم ندارید.

خب بعد از اینکه یه کاری رو به شما پیشنهاد دادن، تا سقف یک هزار دلار کاری به پول شما ندارن، ولی وقتی که از این مقدار بیشتر شد تا زمانی که به ۱۵ هزار دلار می‌رسه، ماهیانه از شما ۱۵ درصد حقوق‌تون رو می‌گیرن. به همین خاطر به نظر می‌رسه که قرارداد خوب و منطقیه.

زمان بندی کلاس‌ها

یه موضوعی که به نظر میاد کمی سازش کردن باهاش سخت باشه، زمان‌بندی کلاس‌هاست. باید بگم که شما تنها در صورتی می‌تونید این کلاس‌ها رو شرکت کنید که هیچ کار دیگه‌ای نداشته باشید. چرا که کلاس‌ها هر هفته از دوشنبه تا جمعه از ۸ صبح به وقت UTC6 (یک ساعت و نیم جلوتر از ما هستند) تا ۵ بعدازظهر برگذار میشه و شما باید سر کلاس‌ها به صورت آنلاین حضور داشته باشید.

متاسفانه خودم نمی‌تونم شرکت کنم!

چه چیزهایی قراره یاد بگیرم؟

خب براساس ادعای خود سرویس، به شما قراره چیزهایی یاد داده بشه که در بین پروژه‌ها و شغل‌ها بیشترین درخواست رو داشته. شما قراره ۶۰۰ ساعت صرف یادگیری توسعه وب به صورت Full-Stack بکنید که شامل یادگیری HTML/CSS/JS/React/Ruby/Ruby on Rails میشه. توی این روند آموزشی بیشتر از ۳۰ پروژه رو هم می‌سازید که اینم پوینت مثبتیه برای خودش. جدای از این گزینه‌ها، شما قراره که با مقدمات دنیای علوم کامپیوتر آشنا بشید که شامل الگوریتم‌ و ساختمان‌های داده میشه. و در نهایت هم فارغ از مباحث تخصصی شما با مهارت‌های نرم یا همون Soft-Skills هم آشنا میشید. فریلنسینگ، مشارکت در کدهای متن باز، آماده شدن برای مصاحبه‌های کاری و ارتباط داشتن با مربی‌های همیشگی هم بخش‌های دیگه‌ای هست که براتون در نظر گرفته شده.

چطوری وارد پروسه یادگیری بشیم؟

خب این قدم کمی سخته، Microverse داره سعی میکنه آدم‌هایی رو درست کنه که بعدا براش پول در بیارن، البته اینقدر خشن نباید به قضیه نگاه کنیم، اون داره یه کاری رو براتون میکنه و شما بابت اون کار باید یه کاری بکنید. قضیه خیلی ساده‌ای هستش. برای وارد شدن به این سیستم شما باید سه مرحله رو پشت سر بذارید. یه سری چالش و سوال‌ها هستش که باید به اون‌ها پاسخ بدید. این فرایند چیزی حدود ۴ روز طول میکشه. در نهایت اگه موفق بشید که چالش‌ها رو به درستی انجام بدید و کارهاتون رو ببرید جلو وارد پروسه اصلی آموزش میشید.

یه نکته مهم هم اینه که شما برای کار کردن با این سرویس و استفاده از آموزش‌ها زبان انگلیسی رو در حد قابل قبولی بدونید.

اگه سوال‌های بیشتری درباره این سرویس دارید سراغ این لینک برید، کلی سوال از پیش جواب داده شده وجود داره که شاید یکی‌ش همون سوال شما باشه.

به شخصه خیلی علاقه‌مند به شرکت در چنین وبسایت‌هایی هستم، بحث اینجا کاملا استعداد و تواناییه، قرار نیست بشینی ادبیات و کتاب‌های بی مربوط بخونی تا یه تست برای وارد شدن به همچین آموزشگاهی بدی، اگه واقعا توانایی‌ش رو داشته باشی، می‌تونی وارد بشی. چی از این بهتر؟!