הקוראת נינה (השם המלא אינו שמור במערכת) הצביעה על העובדה שהספרייה random יודעת לייצר מספרים בלבד, ושאלה איך אפשר לכתוב פונקציה שתייצר מחרוזות אקראיות באופן דומה, בשורה אחת של קוד (אוקי הקטע של השורה האחת זאת תוספת שלי, אבל אם לא היינו אוהבים קיצורים לא היינו כותבים בפייתון ;))
לחסרי הסבלנות, את הקוד הסופי אפשר למצוא בתחתית הפוסט. בואו נתחיל.
קביעת אורך המחרוזת
נינה לא ציינה מה צריך להיות אורך המחרוזת ולכן אניח שהוא צריך להיות אקראי בעצמו. כאמור random לא תוכל לייצר לנו מחרוזות אז לפחות נשתמש ביכולת הגרלת המספרים שלה כדי "להגריל" את אורך המחרוזת שניצור:
אז אחרי שייבאנו את הספרייה והענקנו לה את הכינוי rd אפשר להשתמש בפונקציה randint כדי להגריל מספר בין 5 ל-20 (יכול להיות כל טווח מספרים אחר שתרצו) ולאחסן אותו במשתנה length.
שליפת אותיות
דבר נוסף שנינה לא ציינה הוא מה המחרוזות אמורות להכיל? לצורך העניין נניח שאנחנו רוצים לייצר מחרוזת המורכבת מאותיות בלבד. אנחנו יכולים לרשום את כל האותיות ידנית בתוך מערך כלשהו ולשלוף אותן אחת אחת בצורה רנדומלית (randint תגריל את מיקום האות). אבל זה מרגיש קצת מסורבל וחוץ מזה הגבלנו את עצמנו לשורה יחידה.
לספרייה string יש כמה אופציות שימושיות בשבילנו, למשל ascii_lowercase שמייצרת מחרוזת המכילה את כל אותיות ה-abc (אותיות קטנות). רוצים אותיות גדולות? בשביל זה יש את ascii_uppercase:
במקרה שלנו אנחנו רוצים אותיות משני הסוגים אז עדיף שנשתמש ב-ascii_letters:
אם היינו רוצים להוסיף גם מספרים היינו יכולים להשתמש ב-digits. הפונקציה printable כבר תחזיר לנו את כל התווים שאפשר למצוא במקלדת סטנדרטית – מומלץ אם אתם רוצים לכתוב פונקציה ליצירת סיסמאות!
לצורך השליפה עצמה היינו יכולים להשתמש בלולאה אבל גם כאן יש אופציה טובה יותר. הפונקציה choices של ספריית random יודעת לקחת רצף כלשהו ולשלוף ממנו ערכים באופן רנדומלי. כמות הערכים שישלפו ניתן לקבוע ע"י הפרמטר k (ברירת המחדל היא שליפת ערך יחיד). כל הערכים שנשלפו חוזרים אלינו בצורת רשימה.
מחברים הכל ביחד
אז קיבלנו רשימה של 10 אותיות אקראיות (אם הרצתם את הקוד הזה קיבלתם רשימה שונה כמובן) כאשר כל אות היא מחרוזת נפרדת בתוך רשימה. קרוב אבל אנחנו רוצים הכל במחרוזת יחידה. את הפינה האחרונה הזאת נסגור עם המתודה join שתאחד לנו את כל הערכים ברצף שהיא מקבלת ותוסיף אותם למחרוזת קיימת. אין לנו צורך במחרוזת מקדימה ולכן אצרף את האותיות פשוט לרשימה ריקה בצורה כזאת:
הדוגמה האחרונה כבר מייצרת לנו מחרוזת אותיות תקנית באורך של 10 תווים. נשתמש בהגרלת האורך שכתבנו בשלב הראשון (על המשתנה length אפשר לוותר) ונשתול אותה בתור כמות האותיות המיועדות לשליפה (הערך של הפרמטר k). ולמקרה שתהיתם אין מניעה שיהיו כאן כפילויות.
אז עכשיו אנחנו כבר מייצרים מחרוזת רנדומלית בין 5 ל-20 תווים (בשורה אחת!) ונשאר רק לעטוף את זה בפונקציה כדי לשמור לנו את הבלוק הזה להמשך. כדי להפוך אותה לקצת יותר שימושית נאפשר למשתמש לקבוע את מספר האותיות המקסימלי בעזרת פרמטר בשם max_length
מועיל ומעניין